[4.2.x] Fixed #34464 -- Fixed queryset aggregation over group by reference.
Regression in 59bea9efd2768102fc9d3aedda469502c218e9b7. Refs #28477. Thanks Ian Cubitt for the report. Backport of 9daf8b4109c3e133eb57349bb44d73cc60c5773c from main
This commit is contained in:
parent
4d6a92749c
commit
511dc3db53
@ -453,6 +453,9 @@ class Query(BaseExpression):
|
|||||||
# filtering against window functions is involved as it
|
# filtering against window functions is involved as it
|
||||||
# requires complex realising.
|
# requires complex realising.
|
||||||
annotation_mask = set()
|
annotation_mask = set()
|
||||||
|
if isinstance(self.group_by, tuple):
|
||||||
|
for expr in self.group_by:
|
||||||
|
annotation_mask |= expr.get_refs()
|
||||||
for aggregate in aggregates.values():
|
for aggregate in aggregates.values():
|
||||||
annotation_mask |= aggregate.get_refs()
|
annotation_mask |= aggregate.get_refs()
|
||||||
inner_query.set_annotation_mask(annotation_mask)
|
inner_query.set_annotation_mask(annotation_mask)
|
||||||
|
@ -15,3 +15,6 @@ Bugfixes
|
|||||||
* Fixed a regression in Django 4.2 that caused a crash of
|
* Fixed a regression in Django 4.2 that caused a crash of
|
||||||
:class:`~django.contrib.postgres.search.SearchVector` function with ``%``
|
:class:`~django.contrib.postgres.search.SearchVector` function with ``%``
|
||||||
characters (:ticket:`34459`).
|
characters (:ticket:`34459`).
|
||||||
|
|
||||||
|
* Fixed a regression in Django 4.2 that caused aggregation over query that
|
||||||
|
uses explicit grouping to group against the wrong columns (:ticket:`34464`).
|
||||||
|
@ -36,6 +36,7 @@ from django.db.models.functions import (
|
|||||||
Greatest,
|
Greatest,
|
||||||
Least,
|
Least,
|
||||||
Lower,
|
Lower,
|
||||||
|
Mod,
|
||||||
Now,
|
Now,
|
||||||
Pi,
|
Pi,
|
||||||
TruncDate,
|
TruncDate,
|
||||||
@ -2175,3 +2176,9 @@ class AggregateAnnotationPruningTests(TestCase):
|
|||||||
sql = ctx.captured_queries[0]["sql"].lower()
|
sql = ctx.captured_queries[0]["sql"].lower()
|
||||||
self.assertEqual(sql.count("select"), 2, "Subquery wrapping required")
|
self.assertEqual(sql.count("select"), 2, "Subquery wrapping required")
|
||||||
self.assertEqual(sql.count("authors_count"), 2)
|
self.assertEqual(sql.count("authors_count"), 2)
|
||||||
|
|
||||||
|
def test_referenced_group_by_annotation_kept(self):
|
||||||
|
queryset = Book.objects.values(pages_mod=Mod("pages", 10)).annotate(
|
||||||
|
mod_count=Count("*")
|
||||||
|
)
|
||||||
|
self.assertEqual(queryset.count(), 1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user