Skip to content

Commit

Permalink
[1.1.X] Fixed #12851 -- Corrected the loading of values when select_r…
Browse files Browse the repository at this point in the history
…elated() is used on inherited models. Thanks to phxx for the report and test case.

Backport of r13054 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@13055 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
freakboy3742 committed Apr 30, 2010
1 parent 6f4563a commit 2eb832a
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
2 changes: 1 addition & 1 deletion django/db/models/sql/query.py
Expand Up @@ -621,7 +621,7 @@ def deferred_to_data(self, target, callback):
# models. # models.
workset = {} workset = {}
for model, values in seen.iteritems(): for model, values in seen.iteritems():
for field in model._meta.local_fields: for field in model._meta.fields:
if field in values: if field in values:
continue continue
add_to_dict(workset, model, field) add_to_dict(workset, model, field)
Expand Down
25 changes: 24 additions & 1 deletion tests/regressiontests/select_related_regress/models.py
Expand Up @@ -65,6 +65,9 @@ class Client(models.Model):
state = models.ForeignKey(State, null=True) state = models.ForeignKey(State, null=True)
status = models.ForeignKey(ClientStatus) status = models.ForeignKey(ClientStatus)


class SpecialClient(Client):
value = models.IntegerField()

# Some model inheritance exercises # Some model inheritance exercises
class Parent(models.Model): class Parent(models.Model):
name = models.CharField(max_length=10) name = models.CharField(max_length=10)
Expand Down Expand Up @@ -170,8 +173,28 @@ def __unicode__(self):
>>> wa = State.objects.create(name="Western Australia", country=australia) >>> wa = State.objects.create(name="Western Australia", country=australia)
>>> _ = Client.objects.create(name='Brian Burke', state=wa, status=active) >>> _ = Client.objects.create(name='Brian Burke', state=wa, status=active)
>>> burke = Client.objects.select_related('state').defer('state__name').get(name='Brian Burke') >>> burke = Client.objects.select_related('state').defer('state__name').get(name='Brian Burke')
>>> burke.name
u'Brian Burke'
>>> burke.state.name >>> burke.state.name
u'Western Australia' 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'
"""}

0 comments on commit 2eb832a

Please sign in to comment.