Fixed #22050 -- Fixed defer fields on proxy related models.
This commit is contained in:
parent
815e7a5721
commit
9385aa3198
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue