summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaweł Marczewski <pwmarcz@gmail.com>2015-05-24 19:05:56 +0200
committerTim Graham <timograham@gmail.com>2015-05-25 20:47:28 -0400
commit2aa2b9f291e43bffc07c535dc5906094e6df0bb7 (patch)
tree8849922dd789b15006aca84ea05a22393a290e5f
parent1ac4c7d415750ddc648cbf888bc2fbcde933f799 (diff)
[1.8.x] Fixed #24835 -- Fixed QuerySet.exists() after an annotation with Count()
QuerySet.exists() incorrectly handled query.group_by = True case (grouping by all select fields), causing GROUP BY expressions to be wiped along with select fields. Backport of 801a84ae329a24d9adf01b700429fe8f1285b2b8 from master
-rw-r--r--django/db/models/sql/query.py3
-rw-r--r--docs/releases/1.8.3.txt3
-rw-r--r--tests/annotations/tests.py4
3 files changed, 10 insertions, 0 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 6f883031ef..1a86266e6c 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -472,6 +472,9 @@ class Query(object):
def has_results(self, using):
q = self.clone()
if not q.distinct:
+ if q.group_by is True:
+ q.add_fields((f.attname for f in self.model._meta.concrete_fields), False)
+ q.set_group_by()
q.clear_select_clause()
q.clear_ordering(True)
q.set_limits(high=1)
diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt
index 09aa2d8fe7..d5bde6040c 100644
--- a/docs/releases/1.8.3.txt
+++ b/docs/releases/1.8.3.txt
@@ -14,3 +14,6 @@ Bugfixes
* Fixed crash during :djadmin:`makemigrations` if a migrations module either
is missing ``__init__.py`` or is a file (:ticket:`24848`).
+
+* Fixed ``exists()`` returning incorrect results after annotation with
+ ``Count()`` (:ticket:`24835`).
diff --git a/tests/annotations/tests.py b/tests/annotations/tests.py
index 9e647cd3f9..c08dd84d57 100644
--- a/tests/annotations/tests.py
+++ b/tests/annotations/tests.py
@@ -245,6 +245,10 @@ class NonAggregateAnnotationTestCase(TestCase):
lambda a: (a['age'], a['age_count'])
)
+ def test_annotate_exists(self):
+ authors = Author.objects.annotate(c=Count('id')).filter(c__gt=1)
+ self.assertFalse(authors.exists())
+
def test_column_field_ordering(self):
"""
Test that columns are aligned in the correct order for