Fixed #22050 -- Fixed defer fields on proxy related models.

This commit is contained in:
Lovas Bence 2014-02-15 12:24:20 +01:00 committed by Tim Graham
parent 815e7a5721
commit 9385aa3198
3 changed files with 20 additions and 2 deletions

View File

@ -585,7 +585,7 @@ class Query(object):
must_include = {orig_opts.concrete_model: set([orig_opts.pk])} must_include = {orig_opts.concrete_model: set([orig_opts.pk])}
for field_name in field_names: for field_name in field_names:
parts = field_name.split(LOOKUP_SEP) parts = field_name.split(LOOKUP_SEP)
cur_model = self.model cur_model = self.model._meta.concrete_model
opts = orig_opts opts = orig_opts
for name in parts[:-1]: for name in parts[:-1]:
old_model = cur_model old_model = cur_model

View File

@ -21,6 +21,11 @@ class RelatedItem(models.Model):
item = models.ForeignKey(Item) item = models.ForeignKey(Item)
class ProxyRelated(RelatedItem):
class Meta:
proxy = True
class Child(models.Model): class Child(models.Model):
name = models.CharField(max_length=10) name = models.CharField(max_length=10)
value = models.IntegerField() value = models.IntegerField()

View File

@ -10,7 +10,9 @@ from django.test import TestCase, override_settings
from .models import ( from .models import (
ResolveThis, Item, RelatedItem, Child, Leaf, Proxy, SimpleItem, Feature, ResolveThis, Item, RelatedItem, Child, Leaf, Proxy, SimpleItem, Feature,
ItemAndSimpleItem, OneToOneItem, SpecialFeature, Location, Request) ItemAndSimpleItem, OneToOneItem, SpecialFeature, Location, Request,
ProxyRelated,
)
class DeferRegressionTest(TestCase): class DeferRegressionTest(TestCase):
@ -207,6 +209,17 @@ class DeferRegressionTest(TestCase):
self.assertEqual(obj.item, item2) self.assertEqual(obj.item, item2)
self.assertEqual(obj.item_id, item2.id) self.assertEqual(obj.item_id, item2.id)
def test_proxy_model_defer_with_selected_related(self):
# Regression for #22050
item = Item.objects.create(name="first", value=47)
related = RelatedItem.objects.create(item=item)
# Defer fields with only()
obj = ProxyRelated.objects.all().select_related().only('item__name')[0]
with self.assertNumQueries(0):
self.assertEqual(obj.item.name, "first")
with self.assertNumQueries(1):
self.assertEqual(obj.item.value, 47)
def test_only_with_select_related(self): def test_only_with_select_related(self):
# Test for #17485. # Test for #17485.
item = SimpleItem.objects.create(name='first', value=47) item = SimpleItem.objects.create(name='first', value=47)