summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2022-11-29 12:31:14 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-11-29 13:08:05 +0100
commit0db8bf3d60f7a027391ce89555bdb4a95ad0a227 (patch)
tree5432b4786346b66e199d60e3541108220cb2c15a
parent85b52d22fd2841c34e95b3a80d6f2b668ce2f160 (diff)
Refs #10929 -- Fixed aggregates crash when passing strings as defaults.
Previously strings were interpreted as F() expressions and default crashed with AttributeError: 'F' object has no attribute 'empty_result_set_value'
-rw-r--r--django/db/models/aggregates.py4
-rw-r--r--tests/postgres_tests/test_aggregates.py1
2 files changed, 4 insertions, 1 deletions
diff --git a/django/db/models/aggregates.py b/django/db/models/aggregates.py
index 7878fb6fb2..e2e0ef762b 100644
--- a/django/db/models/aggregates.py
+++ b/django/db/models/aggregates.py
@@ -2,7 +2,7 @@
Classes to represent the definitions of aggregate functions.
"""
from django.core.exceptions import FieldError, FullResultSet
-from django.db.models.expressions import Case, Func, Star, When
+from django.db.models.expressions import Case, Func, Star, Value, When
from django.db.models.fields import IntegerField
from django.db.models.functions.comparison import Coalesce
from django.db.models.functions.mixins import (
@@ -85,6 +85,8 @@ class Aggregate(Func):
return c
if hasattr(default, "resolve_expression"):
default = default.resolve_expression(query, allow_joins, reuse, summarize)
+ else:
+ default = Value(default, c._output_field_or_none)
c.default = None # Reset the default argument before wrapping.
coalesce = Coalesce(c, default, output_field=c._output_field_or_none)
coalesce.is_summary = c.is_summary
diff --git a/tests/postgres_tests/test_aggregates.py b/tests/postgres_tests/test_aggregates.py
index 9cca121802..629493b78f 100644
--- a/tests/postgres_tests/test_aggregates.py
+++ b/tests/postgres_tests/test_aggregates.py
@@ -125,6 +125,7 @@ class TestGeneralAggregate(PostgreSQLTestCase):
(BoolAnd("boolean_field", default=False), False),
(BoolOr("boolean_field", default=False), False),
(JSONBAgg("integer_field", default=Value('["<empty>"]')), ["<empty>"]),
+ (StringAgg("char_field", delimiter=";", default="<empty>"), "<empty>"),
(
StringAgg("char_field", delimiter=";", default=Value("<empty>")),
"<empty>",