diff options
| -rw-r--r-- | AUTHORS | 1 | ||||
| -rw-r--r-- | django/db/models/query_utils.py | 2 | ||||
| -rw-r--r-- | tests/defer/tests.py | 14 | ||||
| -rw-r--r-- | tests/many_to_one/tests.py | 13 |
4 files changed, 29 insertions, 1 deletions
@@ -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) |
