Fixed #30482 -- Prevented unnecessary evaluation of lookup.queryset in prefetch_related_objects().

This commit is contained in:
Iain Watts 2019-05-15 16:09:16 -07:00 committed by Mariusz Felisiak
parent 4442ee8a51
commit 59ffafa1d2
2 changed files with 11 additions and 6 deletions

View File

@ -1556,7 +1556,7 @@ def prefetch_related_objects(model_instances, *related_lookups):
while all_lookups:
lookup = all_lookups.pop()
if lookup.prefetch_to in done_queries:
if lookup.queryset:
if lookup.queryset is not None:
raise ValueError("'%s' lookup was already seen with a different queryset. "
"You may need to adjust the ordering of your lookups." % lookup.prefetch_to)

View File

@ -400,11 +400,16 @@ class CustomPrefetchTests(TestCase):
"'houses' lookup was already seen with a different queryset. You "
"may need to adjust the ordering of your lookups."
)
with self.assertRaisesMessage(ValueError, msg):
self.traverse_qs(
Person.objects.prefetch_related('houses__rooms', Prefetch('houses', queryset=House.objects.all())),
[['houses', 'rooms']]
)
# lookup.queryset shouldn't be evaluated.
with self.assertNumQueries(3):
with self.assertRaisesMessage(ValueError, msg):
self.traverse_qs(
Person.objects.prefetch_related(
'houses__rooms',
Prefetch('houses', queryset=House.objects.all()),
),
[['houses', 'rooms']],
)
# Ambiguous: Lookup houses_lst doesn't yet exist when performing houses_lst__rooms.
msg = (