summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Timmins <jameshtimmins@gmail.com>2019-09-19 19:20:40 -0700
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-09-20 11:14:39 +0200
commit3697ddbf7526e85483067db5a2fde93f661da360 (patch)
tree29fe1740f7109dc9cd51f621cfdd5d91873b7632
parentdef1857d9b7c79a48c0c3ecf997321fa76b479d9 (diff)
[3.0.x] Fixed #30771 -- Fixed exact lookup against queries with selected columns.
Use pre-existing select fields (and thereby GROUP BY fields) from subquery if they were specified, instead of always defaulting to pk. Thanks Aur Saraf for the report and Simon Charette for guidance. Backport of 0719edcd5fed56157ffb3323a8f634aa5e8f9a80 from master
-rw-r--r--AUTHORS1
-rw-r--r--django/db/models/lookups.py6
-rw-r--r--tests/lookup/tests.py13
3 files changed, 17 insertions, 3 deletions
diff --git a/AUTHORS b/AUTHORS
index 460bb9a7df..87011bf1e8 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -384,6 +384,7 @@ answer newbie questions, and generally made Django that much better:
James Bennett <james@b-list.org>
James Murty
James Tauber <jtauber@jtauber.com>
+ James Timmins <jameshtimmins@gmail.com>
James Wheare <django@sparemint.com>
Jannis Leidel <jannis@leidel.info>
Janos Guljas
diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py
index 105dc93251..2683d8971a 100644
--- a/django/db/models/lookups.py
+++ b/django/db/models/lookups.py
@@ -262,9 +262,9 @@ class Exact(FieldGetDbPrepValueMixin, BuiltinLookup):
from django.db.models.sql.query import Query
if isinstance(self.rhs, Query):
if self.rhs.has_limit_one():
- # The subquery must select only the pk.
- self.rhs.clear_select_clause()
- self.rhs.add_fields(['pk'])
+ if not self.rhs.has_select_fields:
+ self.rhs.clear_select_clause()
+ self.rhs.add_fields(['pk'])
else:
raise ValueError(
'The QuerySet value for an exact lookup must be limited to '
diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py
index a603824c0d..1958b995b2 100644
--- a/tests/lookup/tests.py
+++ b/tests/lookup/tests.py
@@ -5,6 +5,7 @@ from operator import attrgetter
from django.core.exceptions import FieldError
from django.db import connection
+from django.db.models import Max
from django.db.models.expressions import Exists, OuterRef
from django.db.models.functions import Substr
from django.test import TestCase, skipUnlessDBFeature
@@ -956,3 +957,15 @@ class LookupTests(TestCase):
),
)
self.assertEqual(qs.get(has_author_alias_match=True), tag)
+
+ def test_exact_query_rhs_with_selected_columns(self):
+ newest_author = Author.objects.create(name='Author 2')
+ authors_max_ids = Author.objects.filter(
+ name='Author 2',
+ ).values(
+ 'name',
+ ).annotate(
+ max_id=Max('id'),
+ ).values('max_id')
+ authors = Author.objects.filter(id=authors_max_ids[:1])
+ self.assertEqual(authors.get(), newest_author)