diff options
| author | Étienne Beaulé <beauleetienne0@gmail.com> | 2019-06-04 04:01:16 -0300 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2019-06-05 09:15:21 +0200 |
| commit | 4e6f0024f19f74be2fe4d9ec637b87e82054ebd6 (patch) | |
| tree | 08f29cbdc2a67fcdd3aaf3a6ff201b40fd21d696 /tests | |
| parent | ca3f86288a16edbea55149aebc8d2df894b3033f (diff) | |
[2.2.x] Fixed #30542 -- Fixed crash of numerical aggregations with filter.
Filters in annotations crashed when used with numerical-type
aggregations (i.e. Avg, StdDev, and Variance). This was caused as the
source expressions no not necessarily have an output_field (such as the
filter field), which lead to an AttributeError: 'WhereNode' object has
no attribute output_field.
Thanks to Chuan-Zheng Lee for the report.
Regression in c690afb873cac8035a3cb3be7c597a5ff0e4b261 and two following
commits.
Backport of 4b6dfe16226a81fea464ac5f77942f4d6ba266e8 from master.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/aggregation/test_filter_argument.py | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/tests/aggregation/test_filter_argument.py b/tests/aggregation/test_filter_argument.py index 63dee59464..9d6c0a52af 100644 --- a/tests/aggregation/test_filter_argument.py +++ b/tests/aggregation/test_filter_argument.py @@ -1,8 +1,11 @@ import datetime from decimal import Decimal -from django.db.models import Case, Count, F, Q, Sum, When +from django.db.models import ( + Avg, Case, Count, F, Q, StdDev, Sum, Variance, When, +) from django.test import TestCase +from django.test.utils import Approximate from .models import Author, Book, Publisher @@ -40,6 +43,16 @@ class FilteredAggregateTests(TestCase): agg = Sum('age', filter=Q(name__startswith='test')) self.assertEqual(Author.objects.aggregate(age=agg)['age'], 200) + def test_filtered_numerical_aggregates(self): + for aggregate, expected_result in ( + (Avg, Approximate(66.7, 1)), + (StdDev, Approximate(24.9, 1)), + (Variance, Approximate(622.2, 1)), + ): + with self.subTest(aggregate=aggregate.__name__): + agg = aggregate('age', filter=Q(name__startswith='test')) + self.assertEqual(Author.objects.aggregate(age=agg)['age'], expected_result) + def test_double_filtered_aggregates(self): agg = Sum('age', filter=Q(Q(name='test2') & ~Q(name='test'))) self.assertEqual(Author.objects.aggregate(age=agg)['age'], 60) |
