From e08fa42fa6d0e9f2a74e8fcdc5a47f5c3b825877 Mon Sep 17 00:00:00 2001 From: blingblin-g Date: Thu, 31 Jul 2025 00:03:27 +0900 Subject: Fixed #36426 -- Added support for further iterables in prefetch_related_objects(). Thanks Sarah Boyce for the review. --- .../test_prefetch_related_objects.py | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'tests') diff --git a/tests/prefetch_related/test_prefetch_related_objects.py b/tests/prefetch_related/test_prefetch_related_objects.py index eea9a7fff7..20f620417a 100644 --- a/tests/prefetch_related/test_prefetch_related_objects.py +++ b/tests/prefetch_related/test_prefetch_related_objects.py @@ -1,3 +1,5 @@ +from collections import deque + from django.db.models import Prefetch, prefetch_related_objects from django.test import TestCase @@ -221,3 +223,32 @@ class PrefetchRelatedObjectsTests(TestCase): with self.assertNumQueries(0): self.assertCountEqual(book1.authors.all(), [self.author1, self.author2]) + + def test_prefetch_related_objects_with_various_iterables(self): + book = self.book1 + + class MyIterable: + def __iter__(self): + yield book + + cases = { + "set": {book}, + "tuple": (book,), + "dict_values": {"a": book}.values(), + "frozenset": frozenset([book]), + "deque": deque([book]), + "custom iterator": MyIterable(), + } + for case_type, case in cases.items(): + with self.subTest(case=case_type): + # Clear the prefetch cache. + book._prefetched_objects_cache = {} + with self.assertNumQueries(1): + prefetch_related_objects(case, "authors") + with self.assertNumQueries(0): + self.assertCountEqual( + book.authors.all(), [self.author1, self.author2, self.author3] + ) + + def test_prefetch_related_objects_empty(self): + prefetch_related_objects([], "authors") -- cgit v1.3