From e888a9b30dd9d62a930b9244d1b5531bb17544b4 Mon Sep 17 00:00:00 2001 From: Florian Hahn Date: Tue, 19 Feb 2013 22:58:09 +0100 Subject: [PATCH] Fixed #15624 -- Made sure aggregations are present in SELECT --- django/db/models/query.py | 1 - django/db/models/sql/query.py | 3 +++ tests/aggregation_regress/tests.py | 7 +++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/django/db/models/query.py b/django/db/models/query.py index 406838f907..63861bb71b 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -319,7 +319,6 @@ class QuerySet(object): query.add_aggregate(aggregate_expr, self.model, alias, is_summary=True) aggregate_names.append(alias) - query.append_aggregate_mask(aggregate_names) return query.get_aggregation(using=self.db) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 9d4bb69d48..fa7ae51d9c 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -321,6 +321,7 @@ class Query(object): # information but retrieves only the first row. Aggregate # over the subquery instead. if self.group_by is not None: + from django.db.models.sql.subqueries import AggregateQuery query = AggregateQuery(self.model) @@ -996,6 +997,8 @@ class Query(object): field_name = field_list[0] source = opts.get_field(field_name) col = field_name + # We want to have the alias in SELECT clause even if mask is set. + self.append_aggregate_mask([alias]) # Add the aggregate to the query aggregate.add_to_query(self, alias, col=col, source=source, is_summary=is_summary) diff --git a/tests/aggregation_regress/tests.py b/tests/aggregation_regress/tests.py index 0838cb8fe8..8388e78dbe 100644 --- a/tests/aggregation_regress/tests.py +++ b/tests/aggregation_regress/tests.py @@ -250,6 +250,13 @@ class AggregationTests(TestCase): 'price__max': Decimal("82.80") }) + # Regression for #15624 - Missing SELECT columns when using values, annotate + # and aggregate in a single query + self.assertEqual( + Book.objects.annotate(c=Count('authors')).values('c').aggregate(Max('c')), + {'c__max': 3} + ) + def test_field_error(self): # Bad field requests in aggregates are caught and reported self.assertRaises(