From cbcf78fa949091e037861d66d942d7fb31d57bf6 Mon Sep 17 00:00:00 2001 From: Y3K Date: Sun, 30 Aug 2015 23:18:03 -0500 Subject: [PATCH] Fixed #25252 -- Added friendly error message on incorrect .select_related() use Using select_related() after .values() or .values_list() is not possible because .values() or .values_list() already got the values they need. --- django/db/models/query.py | 4 ++++ tests/select_related/tests.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/django/db/models/query.py b/django/db/models/query.py index c147928759..4480add93c 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -843,6 +843,10 @@ class QuerySet(object): If select_related(None) is called, the list is cleared. """ + + if self._fields is not None: + raise TypeError("Cannot call select_related() after .values() or .values_list()") + obj = self._clone() if fields == (None,): obj.query.select_related = False diff --git a/tests/select_related/tests.py b/tests/select_related/tests.py index 9a027ac18c..53353a7715 100644 --- a/tests/select_related/tests.py +++ b/tests/select_related/tests.py @@ -163,6 +163,26 @@ class SelectRelatedTests(TestCase): self.assertEqual(obj.parent_1, parent_1) self.assertEqual(obj.parent_2, parent_2) + def test_select_related_after_values(self): + """ + Running select_related() after calling values() raises a TypeError + """ + + message = "Cannot call select_related() after .values() or .values_list()" + + with self.assertRaisesMessage(TypeError, message): + list(Species.objects.values('name').select_related('genus')) + + def test_select_related_after_values_list(self): + """ + Running select_related() after calling values_list() raises a TypeError + """ + + message = "Cannot call select_related() after .values() or .values_list()" + + with self.assertRaisesMessage(TypeError, message): + list(Species.objects.values_list('name').select_related('genus')) + class SelectRelatedValidationTests(SimpleTestCase): """