Fixed #31044 -- Errored nicely when using Prefetch with a raw() queryset.
This commit is contained in:
parent
9e565386d3
commit
4540842bc3
|
@ -1534,8 +1534,15 @@ class Prefetch:
|
||||||
self.prefetch_through = lookup
|
self.prefetch_through = lookup
|
||||||
# `prefetch_to` is the path to the attribute that stores the result.
|
# `prefetch_to` is the path to the attribute that stores the result.
|
||||||
self.prefetch_to = lookup
|
self.prefetch_to = lookup
|
||||||
if queryset is not None and not issubclass(queryset._iterable_class, ModelIterable):
|
if queryset is not None and (
|
||||||
raise ValueError('Prefetch querysets cannot use values().')
|
isinstance(queryset, RawQuerySet) or (
|
||||||
|
hasattr(queryset, '_iterable_class') and
|
||||||
|
not issubclass(queryset._iterable_class, ModelIterable)
|
||||||
|
)
|
||||||
|
):
|
||||||
|
raise ValueError(
|
||||||
|
'Prefetch querysets cannot use raw() and values().'
|
||||||
|
)
|
||||||
if to_attr:
|
if to_attr:
|
||||||
self.prefetch_to = LOOKUP_SEP.join(lookup.split(LOOKUP_SEP)[:-1] + [to_attr])
|
self.prefetch_to = LOOKUP_SEP.join(lookup.split(LOOKUP_SEP)[:-1] + [to_attr])
|
||||||
|
|
||||||
|
|
|
@ -815,12 +815,18 @@ class CustomPrefetchTests(TestCase):
|
||||||
self.traverse_qs(list(houses), [['occupants', 'houses', 'main_room']])
|
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().'):
|
msg = 'Prefetch querysets cannot use raw() and values().'
|
||||||
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
Prefetch('houses', House.objects.values('pk'))
|
Prefetch('houses', House.objects.values('pk'))
|
||||||
# That error doesn't affect managers with custom ModelIterable subclasses
|
# That error doesn't affect managers with custom ModelIterable subclasses
|
||||||
self.assertIs(Teacher.objects_custom.all()._iterable_class, ModelIterableSubclass)
|
self.assertIs(Teacher.objects_custom.all()._iterable_class, ModelIterableSubclass)
|
||||||
Prefetch('teachers', Teacher.objects_custom.all())
|
Prefetch('teachers', Teacher.objects_custom.all())
|
||||||
|
|
||||||
|
def test_raw_queryset(self):
|
||||||
|
msg = 'Prefetch querysets cannot use raw() and values().'
|
||||||
|
with self.assertRaisesMessage(ValueError, msg):
|
||||||
|
Prefetch('houses', House.objects.raw('select pk from house'))
|
||||||
|
|
||||||
def test_to_attr_doesnt_cache_through_attr_as_list(self):
|
def test_to_attr_doesnt_cache_through_attr_as_list(self):
|
||||||
house = House.objects.prefetch_related(
|
house = House.objects.prefetch_related(
|
||||||
Prefetch('rooms', queryset=Room.objects.all(), to_attr='to_rooms'),
|
Prefetch('rooms', queryset=Room.objects.all(), to_attr='to_rooms'),
|
||||||
|
|
Loading…
Reference in New Issue