diff options
| author | Simon Charette <charette.s@gmail.com> | 2022-11-29 12:31:14 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-11-29 13:08:05 +0100 |
| commit | 0db8bf3d60f7a027391ce89555bdb4a95ad0a227 (patch) | |
| tree | 5432b4786346b66e199d60e3541108220cb2c15a | |
| parent | 85b52d22fd2841c34e95b3a80d6f2b668ce2f160 (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.py | 4 | ||||
| -rw-r--r-- | tests/postgres_tests/test_aggregates.py | 1 |
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>", |
