From 84b7cb7df00192b2f804e2c6fd98b78b5bfd1ffa Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 31 Aug 2017 08:59:45 +0800 Subject: [PATCH] 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. --- django/db/models/sql/query.py | 2 +- tests/defer/tests.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 9492e5bd58..0473654fe1 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -649,7 +649,7 @@ class Query: # models. workset = {} for model, values in seen.items(): - for field in model._meta.fields: + for field in model._meta.local_fields: if field in values: continue m = field.model._meta.concrete_model diff --git a/tests/defer/tests.py b/tests/defer/tests.py index 6badd7056e..a3ef1c58b1 100644 --- a/tests/defer/tests.py +++ b/tests/defer/tests.py @@ -188,6 +188,11 @@ class BigChildDeferTests(AssertionMixin, TestCase): self.assertEqual(obj.value, "foo") 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): # You can retrieve a single field on a baseclass obj = BigChild.objects.only("name").get(name="b1")