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.