[4.1.x] Fixed #34016 -- Fixed QuerySet.values()/values_list() crash on ArrayAgg() and JSONBAgg().

Regression in e06dc4571e.

Backport of f88fc72da4 from main
This commit is contained in:
Alexander Kerkum 2022-09-16 16:47:50 +02:00 committed by Mariusz Felisiak
parent 0859093f7c
commit 2d20386b41
3 changed files with 18 additions and 2 deletions

View File

@ -14,10 +14,13 @@ class OrderableAggMixin:
return super().resolve_expression(*args, **kwargs)
def get_source_expressions(self):
return super().get_source_expressions() + [self.order_by]
if self.order_by.source_expressions:
return super().get_source_expressions() + [self.order_by]
return super().get_source_expressions()
def set_source_expressions(self, exprs):
*exprs, self.order_by = exprs
if isinstance(exprs[-1], OrderByList):
*exprs, self.order_by = exprs
return super().set_source_expressions(exprs)
def as_sql(self, compiler, connection):

View File

@ -18,3 +18,7 @@ Bugfixes
* Fixed a bug in Django 4.1 that caused an incorrect validation of
``CheckConstraint`` on ``NULL`` values (:ticket:`33996`).
* Fixed a regression in Django 4.1 that caused a
``QuerySet.values()/values_list()`` crash on ``ArrayAgg()`` and
``JSONBAgg()`` (:ticket:`34016`).

View File

@ -686,6 +686,15 @@ class TestGeneralAggregate(PostgreSQLTestCase):
],
)
def test_values_list(self):
tests = [ArrayAgg("integer_field"), JSONBAgg("integer_field")]
for aggregation in tests:
with self.subTest(aggregation=aggregation):
self.assertCountEqual(
AggregateTestModel.objects.values_list(aggregation),
[([0],), ([1],), ([2],), ([0],)],
)
class TestAggregateDistinct(PostgreSQLTestCase):
@classmethod