summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2010-04-30 14:07:47 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2010-04-30 14:07:47 +0000
commit4e97d7f8e4acddb2b33d0a1e8bca721ae63d7d7c (patch)
tree18859ad6b02ba2d3ee2a09fac1a8d0e5c6b339bd
parent1ff7ed2e69081eacaa6e160f99beabe35853cb02 (diff)
Fixed #12851 -- Corrected the loading of values when select_related() is used on inherited models. Thanks to phxx for the report and test case.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@13054 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/db/models/sql/query.py2
-rw-r--r--tests/regressiontests/select_related_regress/models.py25
2 files changed, 25 insertions, 2 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index cfe5d37a37..40faa545c8 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -556,7 +556,7 @@ class Query(object):
# models.
workset = {}
for model, values in seen.iteritems():
- for field in model._meta.local_fields:
+ for field in model._meta.fields:
if field in values:
continue
add_to_dict(workset, model, field)
diff --git a/tests/regressiontests/select_related_regress/models.py b/tests/regressiontests/select_related_regress/models.py
index 9eaf934777..c99bee0f7e 100644
--- a/tests/regressiontests/select_related_regress/models.py
+++ b/tests/regressiontests/select_related_regress/models.py
@@ -65,6 +65,9 @@ class Client(models.Model):
state = models.ForeignKey(State, null=True)
status = models.ForeignKey(ClientStatus)
+class SpecialClient(Client):
+ value = models.IntegerField()
+
# Some model inheritance exercises
class Parent(models.Model):
name = models.CharField(max_length=10)
@@ -170,8 +173,28 @@ Exercising select_related() with multi-table model inheritance.
>>> wa = State.objects.create(name="Western Australia", country=australia)
>>> _ = Client.objects.create(name='Brian Burke', state=wa, status=active)
>>> burke = Client.objects.select_related('state').defer('state__name').get(name='Brian Burke')
+>>> burke.name
+u'Brian Burke'
>>> burke.state.name
u'Western Australia'
-"""}
+# Still works if we're dealing with an inherited class
+>>> _ = SpecialClient.objects.create(name='Troy Buswell', state=wa, status=active, value=42)
+>>> troy = SpecialClient.objects.select_related('state').defer('state__name').get(name='Troy Buswell')
+>>> troy.name
+u'Troy Buswell'
+>>> troy.value
+42
+>>> troy.state.name
+u'Western Australia'
+# Still works if we defer an attribute on the inherited class
+>>> troy = SpecialClient.objects.select_related('state').defer('value', 'state__name').get(name='Troy Buswell')
+>>> troy.name
+u'Troy Buswell'
+>>> troy.value
+42
+>>> troy.state.name
+u'Western Australia'
+
+"""}