Commit 9385aa31 authored by Lovas Bence's avatar Lovas Bence Committed by Tim Graham
Browse files

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

parent 815e7a57
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+5 −0
Original line number Diff line number Diff line
@@ -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()
+14 −1
Original line number Diff line number Diff line
@@ -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)