summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/db/models/expressions.py3
-rw-r--r--tests/annotations/tests.py8
-rw-r--r--tests/expressions/tests.py4
3 files changed, 14 insertions, 1 deletions
diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py
index ee786eb763..8d7d72a52a 100644
--- a/django/db/models/expressions.py
+++ b/django/db/models/expressions.py
@@ -857,6 +857,9 @@ class ExpressionWrapper(Expression):
def __init__(self, expression, output_field):
super().__init__(output_field=output_field)
+ if getattr(expression, '_output_field_or_none', True) is None:
+ expression = expression.copy()
+ expression.output_field = output_field
self.expression = expression
def set_source_expressions(self, exprs):
diff --git a/tests/annotations/tests.py b/tests/annotations/tests.py
index c1ac0516ac..9f35074934 100644
--- a/tests/annotations/tests.py
+++ b/tests/annotations/tests.py
@@ -170,6 +170,14 @@ class NonAggregateAnnotationTestCase(TestCase):
self.assertEqual(book.is_book, 1)
self.assertEqual(book.rating_count, 1)
+ def test_combined_expression_annotation_with_aggregation(self):
+ book = Book.objects.annotate(
+ combined=ExpressionWrapper(Value(3) * Value(4), output_field=IntegerField()),
+ rating_count=Count('rating'),
+ ).first()
+ self.assertEqual(book.combined, 12)
+ self.assertEqual(book.rating_count, 1)
+
def test_aggregate_over_annotation(self):
agg = Author.objects.annotate(other_age=F('age')).aggregate(otherage_sum=Sum('other_age'))
other_agg = Author.objects.aggregate(age_sum=Sum('age'))
diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py
index 57e4c8ebc7..459a87797d 100644
--- a/tests/expressions/tests.py
+++ b/tests/expressions/tests.py
@@ -1837,4 +1837,6 @@ class ExpressionWrapperTests(SimpleTestCase):
def test_non_empty_group_by(self):
expr = ExpressionWrapper(Lower(Value('f')), output_field=IntegerField())
- self.assertEqual(expr.get_group_by_cols(alias=None), [expr.expression])
+ group_by_cols = expr.get_group_by_cols(alias=None)
+ self.assertEqual(group_by_cols, [expr.expression])
+ self.assertEqual(group_by_cols[0].output_field, expr.output_field)