From 7ec330eeb96d0874949eacb8ed1bbb97e11807e1 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Tue, 3 May 2016 09:28:31 -0400 Subject: [PATCH] Refs #26565 -- Errored nicely when using Prefetch with a values() queryset. Thanks Maxime Lorant for the report and Anssi for the suggestion. --- django/db/models/query.py | 2 ++ tests/prefetch_related/tests.py | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/django/db/models/query.py b/django/db/models/query.py index 03d12cfa08..1cf2a80994 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1331,6 +1331,8 @@ class Prefetch(object): self.prefetch_through = lookup # `prefetch_to` is the path to the attribute that stores the result. self.prefetch_to = lookup + if queryset is not None and queryset._iterable_class is not ModelIterable: + raise ValueError('Prefetch querysets cannot use values().') if to_attr: self.prefetch_to = LOOKUP_SEP.join(lookup.split(LOOKUP_SEP)[:-1] + [to_attr]) diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py index ef32320c0a..41eee219b8 100644 --- a/tests/prefetch_related/tests.py +++ b/tests/prefetch_related/tests.py @@ -733,6 +733,10 @@ class CustomPrefetchTests(TestCase): self.assertEqual(str(warns[0].message), msg) self.assertEqual(str(warns[0].message), msg) + def test_values_queryset(self): + with self.assertRaisesMessage(ValueError, 'Prefetch querysets cannot use values().'): + Prefetch('houses', House.objects.values('pk')) + class DefaultManagerTests(TestCase):