Fixed #15624 -- Made sure aggregations are present in SELECT

This commit is contained in:
Florian Hahn 2013-02-19 22:58:09 +01:00 committed by Anssi Kääriäinen
parent e01b5a5823
commit e888a9b30d
3 changed files with 10 additions and 1 deletions

View File

@ -319,7 +319,6 @@ class QuerySet(object):
query.add_aggregate(aggregate_expr, self.model, alias, query.add_aggregate(aggregate_expr, self.model, alias,
is_summary=True) is_summary=True)
aggregate_names.append(alias) aggregate_names.append(alias)
query.append_aggregate_mask(aggregate_names)
return query.get_aggregation(using=self.db) return query.get_aggregation(using=self.db)

View File

@ -321,6 +321,7 @@ class Query(object):
# information but retrieves only the first row. Aggregate # information but retrieves only the first row. Aggregate
# over the subquery instead. # over the subquery instead.
if self.group_by is not None: if self.group_by is not None:
from django.db.models.sql.subqueries import AggregateQuery from django.db.models.sql.subqueries import AggregateQuery
query = AggregateQuery(self.model) query = AggregateQuery(self.model)
@ -996,6 +997,8 @@ class Query(object):
field_name = field_list[0] field_name = field_list[0]
source = opts.get_field(field_name) source = opts.get_field(field_name)
col = 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 # Add the aggregate to the query
aggregate.add_to_query(self, alias, col=col, source=source, is_summary=is_summary) aggregate.add_to_query(self, alias, col=col, source=source, is_summary=is_summary)

View File

@ -250,6 +250,13 @@ class AggregationTests(TestCase):
'price__max': Decimal("82.80") '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): def test_field_error(self):
# Bad field requests in aggregates are caught and reported # Bad field requests in aggregates are caught and reported
self.assertRaises( self.assertRaises(