[3.0.x] Fixed #31136 -- Disabled grouping by aliases on QuerySet.values()/values_list().

Regression in fb3f034f1c.

Thanks Sigurd Ljødal for the report.
Backport of 0f843fdd5b from master
This commit is contained in:
Mariusz Felisiak 2020-01-04 20:49:11 +01:00
parent 02cda09b13
commit 4f81f6d236
3 changed files with 21 additions and 1 deletions

View File

@ -2100,7 +2100,9 @@ class Query(BaseExpression):
if self.group_by is True:
self.add_fields((f.attname for f in self.model._meta.concrete_fields), False)
self.set_group_by()
# Disable GROUP BY aliases to avoid orphaning references to the
# SELECT clause which is about to be cleared.
self.set_group_by(allow_aliases=False)
self.clear_select_fields()
if fields:

View File

@ -12,3 +12,7 @@ Bugfixes
* Fixed a regression in Django 3.0 that caused a crash when subtracting
``DateField``, ``DateTimeField``, or ``TimeField`` from a ``Subquery()``
annotation (:ticket:`31133`).
* Fixed a regression in Django 3.0 where ``QuerySet.values()`` and
``values_list()`` crashed if a queryset contained an aggregation and
``Exists()`` annotation (:ticket:`31136`).

View File

@ -1149,6 +1149,20 @@ class AggregateTestCase(TestCase):
)
self.assertTrue(publisher_qs.exists())
def test_aggregation_exists_annotation(self):
published_books = Book.objects.filter(publisher=OuterRef('pk'))
publisher_qs = Publisher.objects.annotate(
published_book=Exists(published_books),
count=Count('book'),
).values_list('name', flat=True)
self.assertCountEqual(list(publisher_qs), [
'Apress',
'Morgan Kaufmann',
"Jonno's House of Books",
'Prentice Hall',
'Sams',
])
@skipUnlessDBFeature('supports_subqueries_in_group_by')
def test_group_by_subquery_annotation(self):
"""