summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2017-08-31 08:59:45 +0800
committerTim Graham <timograham@gmail.com>2017-08-31 09:35:05 -0400
commit84b7cb7df00192b2f804e2c6fd98b78b5bfd1ffa (patch)
tree8ce9b667e5bf0b462a3d933b1e7afb866dd3b8a5
parente5bd585c6eb1e13e2f8aac030b33c077b0b70c05 (diff)
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.
-rw-r--r--django/db/models/sql/query.py2
-rw-r--r--tests/defer/tests.py5
2 files changed, 6 insertions, 1 deletions
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")