Skip to content

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

Closed
wants to merge 6 commits into from
View
2 django/db/models/sql/query.py
@@ -585,7 +585,7 @@ def deferred_to_data(self, target, callback):
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
View
5 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()
View
10 tests/defer_regress/tests.py
@@ -9,7 +9,7 @@
from django.test import TestCase, override_settings
from .models import (
- ResolveThis, Item, RelatedItem, Child, Leaf, Proxy, SimpleItem, Feature,
+ ResolveThis, Item, RelatedItem, ProxyRelated, Child, Leaf, Proxy, SimpleItem, Feature,
ItemAndSimpleItem, OneToOneItem, SpecialFeature, Location, Request)
@@ -207,6 +207,14 @@ def test_defer_with_select_related(self):
self.assertEqual(obj.item, item2)
self.assertEqual(obj.item_id, item2.id)
+ related = RelatedItem.objects.create(item=item1)
@timgraham
Django member
timgraham added a note Jun 14, 2014

any reason not to use a separate test method?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ ### 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)
Something went wrong with that request. Please try again.