From 691486a5cf7588c95250a873c5b57748e82fc4c2 Mon Sep 17 00:00:00 2001 From: David Wobrock Date: Tue, 31 Aug 2021 22:37:07 +0200 Subject: [PATCH] Fixed #33073 -- Fixed queryset crash with aggregation and empty/extra queryset annotation. --- django/db/models/sql/query.py | 2 +- tests/aggregation/tests.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 1258eb61a9..39a735b50e 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -1692,7 +1692,7 @@ class Query(BaseExpression): yield expr elif include_external and callable(getattr(expr, 'get_external_cols', None)): yield from expr.get_external_cols() - else: + elif hasattr(expr, 'get_source_expressions'): yield from cls._gen_cols( expr.get_source_expressions(), include_external=include_external, diff --git a/tests/aggregation/tests.py b/tests/aggregation/tests.py index c5fd590543..85742dcb9c 100644 --- a/tests/aggregation/tests.py +++ b/tests/aggregation/tests.py @@ -1603,3 +1603,17 @@ class AggregateTestCase(TestCase): value=Sum('price', filter=Q(rating__lt=3.0), default=Avg('pages') / 10.0), ) self.assertAlmostEqual(result['value'], Decimal('61.72'), places=2) + + def test_exists_none_with_aggregate(self): + qs = Book.objects.all().annotate( + count=Count('id'), + exists=Exists(Author.objects.none()), + ) + self.assertEqual(len(qs), 6) + + def test_exists_extra_where_with_aggregate(self): + qs = Book.objects.all().annotate( + count=Count('id'), + exists=Exists(Author.objects.extra(where=['1=0'])), + ) + self.assertEqual(len(qs), 6)