diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index cb2bb2f1b8c..691de177e06 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -585,7 +585,7 @@ class Query(object): must_include = {orig_opts.concrete_model: set([orig_opts.pk])} for field_name in field_names: parts = field_name.split(LOOKUP_SEP) - cur_model = self.model + cur_model = self.model._meta.concrete_model opts = orig_opts for name in parts[:-1]: old_model = cur_model diff --git a/tests/defer_regress/models.py b/tests/defer_regress/models.py index f58a10215ec..58693c83dbb 100644 --- a/tests/defer_regress/models.py +++ b/tests/defer_regress/models.py @@ -21,6 +21,11 @@ class RelatedItem(models.Model): item = models.ForeignKey(Item) +class ProxyRelated(RelatedItem): + class Meta: + proxy = True + + class Child(models.Model): name = models.CharField(max_length=10) value = models.IntegerField() diff --git a/tests/defer_regress/tests.py b/tests/defer_regress/tests.py index 97d7e7e3021..f2d4e227b90 100644 --- a/tests/defer_regress/tests.py +++ b/tests/defer_regress/tests.py @@ -10,7 +10,9 @@ from django.test import TestCase, override_settings from .models import ( ResolveThis, Item, RelatedItem, Child, Leaf, Proxy, SimpleItem, Feature, - ItemAndSimpleItem, OneToOneItem, SpecialFeature, Location, Request) + ItemAndSimpleItem, OneToOneItem, SpecialFeature, Location, Request, + ProxyRelated, +) class DeferRegressionTest(TestCase): @@ -207,6 +209,17 @@ class DeferRegressionTest(TestCase): self.assertEqual(obj.item, item2) 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): # Test for #17485. item = SimpleItem.objects.create(name='first', value=47)