Fixed #28549 -- Fixed QuerySet.defer() with super and subclass fields.

Previously, deferring fields in different classes didn't omit the
superclass' deferred field.

Thanks Simon Charette for the suggested fix.
This commit is contained in:
Jeremy Kerr 2017-08-31 08:59:45 +08:00 committed by Tim Graham
parent e5bd585c6e
commit 84b7cb7df0
2 changed files with 6 additions and 1 deletions

View File

@ -649,7 +649,7 @@ class Query:
# models. # models.
workset = {} workset = {}
for model, values in seen.items(): for model, values in seen.items():
for field in model._meta.fields: for field in model._meta.local_fields:
if field in values: if field in values:
continue continue
m = field.model._meta.concrete_model m = field.model._meta.concrete_model

View File

@ -188,6 +188,11 @@ class BigChildDeferTests(AssertionMixin, TestCase):
self.assertEqual(obj.value, "foo") self.assertEqual(obj.value, "foo")
self.assertEqual(obj.other, "bar") self.assertEqual(obj.other, "bar")
def test_defer_subclass_both(self):
# Deferring fields from both superclass and subclass works.
obj = BigChild.objects.defer("other", "value").get(name="b1")
self.assert_delayed(obj, 2)
def test_only_baseclass_when_subclass_has_added_field(self): def test_only_baseclass_when_subclass_has_added_field(self):
# You can retrieve a single field on a baseclass # You can retrieve a single field on a baseclass
obj = BigChild.objects.only("name").get(name="b1") obj = BigChild.objects.only("name").get(name="b1")