浏览代码

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

Regression in e06dc4571ea9fd5723c8029959b95808be9f8812.
Alexander Kerkum 2 年之前
父节点
当前提交
f88fc72da4
共有 3 个文件被更改,包括 18 次插入2 次删除
  1. 5 2
      django/contrib/postgres/aggregates/mixins.py
  2. 4 0
      docs/releases/4.1.2.txt
  3. 9 0
      tests/postgres_tests/test_aggregates.py

+ 5 - 2
django/contrib/postgres/aggregates/mixins.py

@@ -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):

+ 4 - 0
docs/releases/4.1.2.txt

@@ -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`).

+ 9 - 0
tests/postgres_tests/test_aggregates.py

@@ -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