Fixed #15624 -- Made sure aggregations are present in SELECT
This commit is contained in:
parent
e01b5a5823
commit
e888a9b30d
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue