summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgarybadwal <gurpreet071999@gmail.com>2026-04-16 11:46:13 +0530
committerJacob Walls <jacobtylerwalls@gmail.com>2026-04-18 16:39:50 +0300
commit820c7d3248af6afbdf3390c97b29e41ba126a421 (patch)
treea8de1afc25db3e6bec1e822bed53b37100f4554c
parent241b8e1aab7fc71018a059467b2ba17bce6556cc (diff)
Fixed #37036 -- Added missing flat=True arg in DeferredAttribute.fetch_many().
-rw-r--r--AUTHORS1
-rw-r--r--django/db/models/query_utils.py2
-rw-r--r--tests/defer/tests.py14
-rw-r--r--tests/many_to_one/tests.py13
4 files changed, 29 insertions, 1 deletions
diff --git a/AUTHORS b/AUTHORS
index 486a50f0e2..07c87068a9 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -422,6 +422,7 @@ answer newbie questions, and generally made Django that much better:
Grzegorz Ĺšlusarek <grzegorz.slusarek@gmail.com>
Guilherme Mesquita Gondim <semente@taurinus.org>
Guillaume Pannatier <guillaume.pannatier@gmail.com>
+ Gurpreet Singh <https://www.garybadwal.com/>
Gustavo Picon
hambaloney
Hang Park <hangpark@kaist.ac.kr>
diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py
index a17274fba0..c282c4f744 100644
--- a/django/db/models/query_utils.py
+++ b/django/db/models/query_utils.py
@@ -296,7 +296,7 @@ class DeferredAttribute:
db = instances[0]._state.db
value_by_pk = (
self.field.model._base_manager.using(db)
- .values_list(attname)
+ .values_list(attname, flat=True)
.in_bulk({i.pk for i in instances})
)
for instance in instances:
diff --git a/tests/defer/tests.py b/tests/defer/tests.py
index 1a5f333fa1..ea7703c1e3 100644
--- a/tests/defer/tests.py
+++ b/tests/defer/tests.py
@@ -219,6 +219,20 @@ class DeferTests(AssertionMixin, TestCase):
with self.assertNumQueries(1):
p1.value
+ def test_defer_fk_fetch_mode_fetch_peers(self):
+ p1, p2 = Primary.objects.fetch_mode(FETCH_PEERS).defer("related")
+ with self.assertNumQueries(2):
+ self.assertEqual(p1.related, self.s1)
+ with self.assertNumQueries(0):
+ self.assertEqual(p2.related, self.s1)
+
+ def test_only_fk_fetch_mode_fetch_peers(self):
+ p1, p2 = Primary.objects.fetch_mode(FETCH_PEERS).only("name")
+ with self.assertNumQueries(2):
+ self.assertEqual(p1.related, self.s1)
+ with self.assertNumQueries(0):
+ self.assertEqual(p2.related, self.s1)
+
def test_only_fetch_mode_raise(self):
p1 = Primary.objects.fetch_mode(RAISE).only("name").get(name="p1")
msg = "Fetching of Primary.value blocked."
diff --git a/tests/many_to_one/tests.py b/tests/many_to_one/tests.py
index e161686906..d6149d521f 100644
--- a/tests/many_to_one/tests.py
+++ b/tests/many_to_one/tests.py
@@ -1002,3 +1002,16 @@ class ManyToOneTests(TestCase):
a2._state.fetch_mode,
FETCH_PEERS,
)
+
+ def test_fetch_mode_fetch_peers_reverse_with_deferred_fk(self):
+ Article.objects.create(
+ headline="Another article",
+ pub_date=datetime.date(2005, 7, 27),
+ reporter=self.r,
+ )
+ r = Reporter.objects.fetch_mode(FETCH_PEERS).get(pk=self.r.pk)
+ a1, a2 = r.article_set.defer("reporter")
+ with self.assertNumQueries(2):
+ self.assertEqual(a1.reporter, self.r)
+ with self.assertNumQueries(0):
+ self.assertEqual(a2.reporter, self.r)