Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

[1.1.X] Fixed #12851 -- Another attempt at fixing select_related() wi…

…th inherited models, this time with only(). Thanks to phxx for the test case.

Backport of r13059 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@13060 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit fe3b75e2764caf3fe7038fc30644e01f14cfc247 1 parent 868acb3
@freakboy3742 freakboy3742 authored
View
12 django/db/models/query.py
@@ -970,7 +970,17 @@ def get_cached_row(klass, row, index_start, max_depth=0, cur_depth=0,
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()
View
4 django/db/models/sql/query.py
@@ -621,10 +621,10 @@ def deferred_to_data(self, target, callback):
# 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
View
9 tests/regressiontests/select_related_regress/models.py
@@ -197,4 +197,13 @@ def __unicode__(self):
>>> 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'
+
"""}
Please sign in to comment.
Something went wrong with that request. Please try again.