summaryrefslogtreecommitdiff
path: root/tests/one_to_one
diff options
context:
space:
mode:
authorAdam Johnson <me@adamj.eu>2023-11-29 09:35:34 +0000
committerJacob Walls <jacobtylerwalls@gmail.com>2025-10-16 14:52:22 -0400
commite097e8a12f21a4e92594830f1ad1942b31916d0f (patch)
tree43f448bf968f0c6c1a48577cbc4d1ba5b920624a /tests/one_to_one
parentf6bd90c84050a1c74fe2161cced00e7282cb845c (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.py38
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__)