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.
This commit is contained in:
Paweł Marczewski 2015-05-24 19:05:56 +02:00 committed by Tim Graham
parent 4df7e8483b
commit 801a84ae32
3 changed files with 10 additions and 0 deletions

View File

@ -489,6 +489,9 @@ class Query(object):
def has_results(self, using): def has_results(self, using):
q = self.clone() q = self.clone()
if not q.distinct: 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_select_clause()
q.clear_ordering(True) q.clear_ordering(True)
q.set_limits(high=1) q.set_limits(high=1)

View File

@ -14,3 +14,6 @@ Bugfixes
* Fixed crash during :djadmin:`makemigrations` if a migrations module either * Fixed crash during :djadmin:`makemigrations` if a migrations module either
is missing ``__init__.py`` or is a file (:ticket:`24848`). is missing ``__init__.py`` or is a file (:ticket:`24848`).
* Fixed ``exists()`` returning incorrect results after annotation with
``Count()`` (:ticket:`24835`).

View File

@ -325,6 +325,10 @@ class NonAggregateAnnotationTestCase(TestCase):
lambda a: (a['age'], a['age_count']) 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): def test_column_field_ordering(self):
""" """
Test that columns are aligned in the correct order for Test that columns are aligned in the correct order for