summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2022-11-07 09:01:50 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-11-07 09:05:24 +0100
commit967f8750ab63f9ca74ce63ada580ccc5b10b3f3b (patch)
tree709e63455125dce026e8a6e2c5b6dd344bd1f600
parent77cf70ea9699c3c4e74663955998753d70f65166 (diff)
Refs #27849 -- Fixed filtered aggregates crash on filters that match everything.
-rw-r--r--django/db/models/aggregates.py23
-rw-r--r--tests/aggregation/test_filter_argument.py13
2 files changed, 25 insertions, 11 deletions
diff --git a/django/db/models/aggregates.py b/django/db/models/aggregates.py
index ec21e5fd11..ab38a33bf0 100644
--- a/django/db/models/aggregates.py
+++ b/django/db/models/aggregates.py
@@ -105,17 +105,18 @@ class Aggregate(Func):
if self.filter:
if connection.features.supports_aggregate_filter_clause:
filter_sql, filter_params = self.filter.as_sql(compiler, connection)
- template = self.filter_template % extra_context.get(
- "template", self.template
- )
- sql, params = super().as_sql(
- compiler,
- connection,
- template=template,
- filter=filter_sql,
- **extra_context,
- )
- return sql, (*params, *filter_params)
+ if filter_sql:
+ template = self.filter_template % extra_context.get(
+ "template", self.template
+ )
+ sql, params = super().as_sql(
+ compiler,
+ connection,
+ template=template,
+ filter=filter_sql,
+ **extra_context,
+ )
+ return sql, (*params, *filter_params)
else:
copy = self.copy()
copy.filter = None
diff --git a/tests/aggregation/test_filter_argument.py b/tests/aggregation/test_filter_argument.py
index caf2cd3d6f..3ef0401d4d 100644
--- a/tests/aggregation/test_filter_argument.py
+++ b/tests/aggregation/test_filter_argument.py
@@ -205,3 +205,16 @@ class FilteredAggregateTests(TestCase):
max_rating=Max("rating", filter=Q(rating__in=[]))
)
self.assertEqual(aggregate, {"max_rating": None})
+
+ def test_filtered_aggregate_full_condition(self):
+ book = Book.objects.annotate(
+ authors_count=Count(
+ "authors",
+ filter=~Q(authors__in=[]),
+ ),
+ ).get(pk=self.b1.pk)
+ self.assertEqual(book.authors_count, 2)
+ aggregate = Book.objects.aggregate(
+ max_rating=Max("rating", filter=~Q(rating__in=[]))
+ )
+ self.assertEqual(aggregate, {"max_rating": 4.5})