Fixed #12851 -- Another attempt at fixing select_related() with inherited models, this time with only(). Thanks to phxx for the test case.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@13059 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2010-04-30 16:32:48 +00:00
parent 21d98c5ebd
commit 8b1aebbf35
3 changed files with 22 additions and 3 deletions

View File

@ -1154,7 +1154,17 @@ def get_cached_row(klass, row, index_start, using, 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 File

@ -556,10 +556,10 @@ class Query(object):
# 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 File

@ -197,4 +197,13 @@ u'Troy Buswell'
>>> 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'
"""}