summaryrefslogtreecommitdiff
path: root/tests/prefetch_related/test_prefetch_related_objects.py
diff options
context:
space:
mode:
authorLaurent Lyaudet <laurent.lyaudet@gmail.com>2024-03-16 06:51:38 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2024-03-20 05:26:18 +0100
commitf2388a4b73ee74bd077854798a0ac1669d037304 (patch)
tree3013afb52ede59d89cfca9acf4e7d62bd52cd3b8 /tests/prefetch_related/test_prefetch_related_objects.py
parent921670c6943e9c532137b7d164885f2d3ab436b8 (diff)
Fixed #35309 -- Made prefetch clear ordering for single-valued relationships.
Diffstat (limited to 'tests/prefetch_related/test_prefetch_related_objects.py')
-rw-r--r--tests/prefetch_related/test_prefetch_related_objects.py72
1 files changed, 69 insertions, 3 deletions
diff --git a/tests/prefetch_related/test_prefetch_related_objects.py b/tests/prefetch_related/test_prefetch_related_objects.py
index ca1f904c52..eea9a7fff7 100644
--- a/tests/prefetch_related/test_prefetch_related_objects.py
+++ b/tests/prefetch_related/test_prefetch_related_objects.py
@@ -1,7 +1,7 @@
from django.db.models import Prefetch, prefetch_related_objects
from django.test import TestCase
-from .models import Author, Book, Reader
+from .models import Author, Book, House, Reader, Room
class PrefetchRelatedObjectsTests(TestCase):
@@ -33,6 +33,17 @@ class PrefetchRelatedObjectsTests(TestCase):
cls.reader1.books_read.add(cls.book1, cls.book4)
cls.reader2.books_read.add(cls.book2, cls.book4)
+ cls.house1 = House.objects.create(name="b1", address="1")
+ cls.house2 = House.objects.create(name="b2", address="2")
+
+ cls.room1 = Room.objects.create(name="a1", house=cls.house1)
+ cls.room2 = Room.objects.create(name="a2", house=cls.house2)
+
+ cls.house1.main_room = cls.room1
+ cls.house1.save()
+ cls.house2.main_room = cls.room2
+ cls.house2.save()
+
def test_unknown(self):
book1 = Book.objects.get(id=self.book1.id)
with self.assertRaises(AttributeError):
@@ -58,20 +69,75 @@ class PrefetchRelatedObjectsTests(TestCase):
def test_foreignkey_forward(self):
authors = list(Author.objects.all())
- with self.assertNumQueries(1):
+ with self.assertNumQueries(1) as ctx:
prefetch_related_objects(authors, "first_book")
+ self.assertNotIn("ORDER BY", ctx.captured_queries[0]["sql"])
with self.assertNumQueries(0):
[author.first_book for author in authors]
+ authors = list(Author.objects.all())
+ with self.assertNumQueries(1) as ctx:
+ prefetch_related_objects(
+ authors,
+ Prefetch("first_book", queryset=Book.objects.order_by("-title")),
+ )
+ self.assertNotIn("ORDER BY", ctx.captured_queries[0]["sql"])
+
def test_foreignkey_reverse(self):
books = list(Book.objects.all())
- with self.assertNumQueries(1):
+ with self.assertNumQueries(1) as ctx:
prefetch_related_objects(books, "first_time_authors")
+ self.assertIn("ORDER BY", ctx.captured_queries[0]["sql"])
with self.assertNumQueries(0):
[list(book.first_time_authors.all()) for book in books]
+ books = list(Book.objects.all())
+ with self.assertNumQueries(1) as ctx:
+ prefetch_related_objects(
+ books,
+ Prefetch(
+ "first_time_authors",
+ queryset=Author.objects.order_by("-name"),
+ ),
+ )
+ self.assertIn("ORDER BY", ctx.captured_queries[0]["sql"])
+
+ def test_one_to_one_forward(self):
+ houses = list(House.objects.all())
+ with self.assertNumQueries(1) as ctx:
+ prefetch_related_objects(houses, "main_room")
+ self.assertNotIn("ORDER BY", ctx.captured_queries[0]["sql"])
+
+ with self.assertNumQueries(0):
+ [house.main_room for house in houses]
+
+ houses = list(House.objects.all())
+ with self.assertNumQueries(1) as ctx:
+ prefetch_related_objects(
+ houses,
+ Prefetch("main_room", queryset=Room.objects.order_by("-name")),
+ )
+ self.assertNotIn("ORDER BY", ctx.captured_queries[0]["sql"])
+
+ def test_one_to_one_reverse(self):
+ rooms = list(Room.objects.all())
+ with self.assertNumQueries(1) as ctx:
+ prefetch_related_objects(rooms, "main_room_of")
+ self.assertNotIn("ORDER BY", ctx.captured_queries[0]["sql"])
+
+ with self.assertNumQueries(0):
+ [room.main_room_of for room in rooms]
+
+ rooms = list(Room.objects.all())
+ with self.assertNumQueries(1) as ctx:
+ prefetch_related_objects(
+ rooms,
+ Prefetch("main_room_of", queryset=House.objects.order_by("-name")),
+ )
+ self.assertNotIn("ORDER BY", ctx.captured_queries[0]["sql"])
+
def test_m2m_then_m2m(self):
"""A m2m can be followed through another m2m."""
authors = list(Author.objects.all())