diff options
| author | Adam Johnson <me@adamj.eu> | 2023-11-29 09:35:34 +0000 |
|---|---|---|
| committer | Jacob Walls <jacobtylerwalls@gmail.com> | 2025-10-16 14:52:22 -0400 |
| commit | e097e8a12f21a4e92594830f1ad1942b31916d0f (patch) | |
| tree | 43f448bf968f0c6c1a48577cbc4d1ba5b920624a /tests/one_to_one | |
| parent | f6bd90c84050a1c74fe2161cced00e7282cb845c (diff) | |
Fixed #28586 -- Added model field fetch modes.
May your database queries be much reduced with minimal effort.
co-authored-by: Andreas Pelme <andreas@pelme.se>
co-authored-by: Simon Charette <charette.s@gmail.com>
co-authored-by: Jacob Walls <jacobtylerwalls@gmail.com>
Diffstat (limited to 'tests/one_to_one')
| -rw-r--r-- | tests/one_to_one/tests.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/one_to_one/tests.py b/tests/one_to_one/tests.py index d9bcb5d4dc..da7bd992c0 100644 --- a/tests/one_to_one/tests.py +++ b/tests/one_to_one/tests.py @@ -1,4 +1,6 @@ +from django.core.exceptions import FieldFetchBlocked from django.db import IntegrityError, connection, transaction +from django.db.models import FETCH_PEERS, RAISE from django.test import TestCase from .models import ( @@ -619,3 +621,39 @@ class OneToOneTests(TestCase): instances=places, querysets=[Bar.objects.all(), Bar.objects.all()], ) + + def test_fetch_mode_fetch_peers_forward(self): + Restaurant.objects.create( + place=self.p2, serves_hot_dogs=True, serves_pizza=False + ) + r1, r2 = Restaurant.objects.fetch_mode(FETCH_PEERS) + with self.assertNumQueries(1): + r1.place + with self.assertNumQueries(0): + r2.place + + def test_fetch_mode_fetch_peers_reverse(self): + Restaurant.objects.create( + place=self.p2, serves_hot_dogs=True, serves_pizza=False + ) + p1, p2 = Place.objects.fetch_mode(FETCH_PEERS) + with self.assertNumQueries(1): + p1.restaurant + with self.assertNumQueries(0): + p2.restaurant + + def test_fetch_mode_raise_forward(self): + r = Restaurant.objects.fetch_mode(RAISE).get(pk=self.r1.pk) + msg = "Fetching of Restaurant.place blocked." + with self.assertRaisesMessage(FieldFetchBlocked, msg) as cm: + r.place + self.assertIsNone(cm.exception.__cause__) + self.assertTrue(cm.exception.__suppress_context__) + + def test_fetch_mode_raise_reverse(self): + p = Place.objects.fetch_mode(RAISE).get(pk=self.p1.pk) + msg = "Fetching of Place.restaurant blocked." + with self.assertRaisesMessage(FieldFetchBlocked, msg) as cm: + p.restaurant + self.assertIsNone(cm.exception.__cause__) + self.assertTrue(cm.exception.__suppress_context__) |
