File: 0004-Fix-QuerySet.defer-with-super-and-subclass-fields.patch

package info (click to toggle)
python-django 1%3A1.11.29-1~deb10u1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 47,428 kB
  • sloc: python: 220,776; javascript: 13,523; makefile: 209; xml: 201; sh: 64
file content (49 lines) | stat: -rw-r--r-- 1,912 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
From: Jeremy Kerr <jk@ozlabs.org>
Date: Thu, 31 Aug 2017 08:59:45 +0800
Subject: Fix QuerySet.defer() with super and subclass fields.

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

commit 84b7cb7df00192b2f804e2c6fd98b78b5bfd1ffa upstream.

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

Thanks Simon Charette for the suggested fix.

[ajd: backported on top of Debian tree]
Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
---
 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 e51b103..8813dce 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -669,7 +669,7 @@ class Query(object):
             # models.
             workset = {}
             for model, values in six.iteritems(seen):
-                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 65f1f2b..ef7180a 100644
--- a/tests/defer/tests.py
+++ b/tests/defer/tests.py
@@ -190,6 +190,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")