Fixed #29230 -- Fixed nested prefetches that clash with descriptors.
This commit is contained in:
parent
e0ff88be4f
commit
6104875a2c
|
@ -1568,7 +1568,7 @@ def prefetch_related_objects(model_instances, *related_lookups):
|
||||||
# same relationships to stop infinite recursion. So, if we
|
# same relationships to stop infinite recursion. So, if we
|
||||||
# are already on an automatically added lookup, don't add
|
# are already on an automatically added lookup, don't add
|
||||||
# the new lookups from relationships we've seen already.
|
# the new lookups from relationships we've seen already.
|
||||||
if not (lookup in auto_lookups and descriptor in followed_descriptors):
|
if not (prefetch_to in done_queries and lookup in auto_lookups and descriptor in followed_descriptors):
|
||||||
done_queries[prefetch_to] = obj_list
|
done_queries[prefetch_to] = obj_list
|
||||||
new_lookups = normalize_prefetch_lookups(reversed(additional_lookups), prefetch_to)
|
new_lookups = normalize_prefetch_lookups(reversed(additional_lookups), prefetch_to)
|
||||||
auto_lookups.update(new_lookups)
|
auto_lookups.update(new_lookups)
|
||||||
|
|
|
@ -772,6 +772,19 @@ class CustomPrefetchTests(TestCase):
|
||||||
self.room2_1
|
self.room2_1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_nested_prefetch_related_with_duplicate_prefetcher(self):
|
||||||
|
"""
|
||||||
|
Nested prefetches whose name clashes with descriptor names
|
||||||
|
(Person.houses here) are allowed.
|
||||||
|
"""
|
||||||
|
occupants = Person.objects.prefetch_related(
|
||||||
|
Prefetch('houses', to_attr='some_attr_name'),
|
||||||
|
Prefetch('houses', queryset=House.objects.prefetch_related('main_room')),
|
||||||
|
)
|
||||||
|
houses = House.objects.prefetch_related(Prefetch('occupants', queryset=occupants))
|
||||||
|
with self.assertNumQueries(5):
|
||||||
|
self.traverse_qs(list(houses), [['occupants', 'houses', 'main_room']])
|
||||||
|
|
||||||
def test_values_queryset(self):
|
def test_values_queryset(self):
|
||||||
with self.assertRaisesMessage(ValueError, 'Prefetch querysets cannot use values().'):
|
with self.assertRaisesMessage(ValueError, 'Prefetch querysets cannot use values().'):
|
||||||
Prefetch('houses', House.objects.values('pk'))
|
Prefetch('houses', House.objects.values('pk'))
|
||||||
|
|
Loading…
Reference in New Issue