Author: russellm
Date: 2010-04-30 11:37:54 -0500 (Fri, 30 Apr 2010)
New Revision: 13060

Modified:
   django/branches/releases/1.1.X/django/db/models/query.py
   django/branches/releases/1.1.X/django/db/models/sql/query.py
   
django/branches/releases/1.1.X/tests/regressiontests/select_related_regress/models.py
Log:
[1.1.X] Fixed #12851 -- Another attempt at fixing select_related() with 
inherited models, this time with only(). Thanks to phxx for the test case.

Backport of r13059 from trunk.

Modified: django/branches/releases/1.1.X/django/db/models/query.py
===================================================================
--- django/branches/releases/1.1.X/django/db/models/query.py    2010-04-30 
16:32:48 UTC (rev 13059)
+++ django/branches/releases/1.1.X/django/db/models/query.py    2010-04-30 
16:37:54 UTC (rev 13060)
@@ -970,7 +970,17 @@
         return None
 
     restricted = requested is not None
-    load_fields = only_load and only_load.get(klass) or None
+    if only_load:
+        load_fields = only_load.get(klass)
+        # When we create the object, we will also be creating populating
+        # all the parent classes, so traverse the parent classes looking
+        # for fields that must be included on load.
+        for parent in klass._meta.get_parent_list():
+            fields = only_load.get(parent)
+            if fields:
+                load_fields.update(fields)
+    else:
+        load_fields = None
     if load_fields:
         # Handle deferred fields.
         skip = set()

Modified: django/branches/releases/1.1.X/django/db/models/sql/query.py
===================================================================
--- django/branches/releases/1.1.X/django/db/models/sql/query.py        
2010-04-30 16:32:48 UTC (rev 13059)
+++ django/branches/releases/1.1.X/django/db/models/sql/query.py        
2010-04-30 16:37:54 UTC (rev 13060)
@@ -621,10 +621,10 @@
             # models.
             workset = {}
             for model, values in seen.iteritems():
-                for field in model._meta.fields:
+                for field, m in model._meta.get_fields_with_model():
                     if field in values:
                         continue
-                    add_to_dict(workset, model, field)
+                    add_to_dict(workset, m or model, field)
             for model, values in must_include.iteritems():
                 # If we haven't included a model in workset, we don't add the
                 # corresponding must_include fields for that model, since an

Modified: 
django/branches/releases/1.1.X/tests/regressiontests/select_related_regress/models.py
===================================================================
--- 
django/branches/releases/1.1.X/tests/regressiontests/select_related_regress/models.py
       2010-04-30 16:32:48 UTC (rev 13059)
+++ 
django/branches/releases/1.1.X/tests/regressiontests/select_related_regress/models.py
       2010-04-30 16:37:54 UTC (rev 13060)
@@ -197,4 +197,13 @@
 >>> troy.state.name
 u'Western Australia'
 
+# Also works if you use only, rather than defer
+>>> troy = 
SpecialClient.objects.select_related('state').only('name').get(name='Troy 
Buswell')
+>>> troy.name
+u'Troy Buswell'
+>>> troy.value
+42
+>>> troy.state.name
+u'Western Australia'
+
 """}

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to