From 90d365d869924d503565eb1ccdc24077d60faf0c Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Fri, 29 Dec 2023 01:28:19 -0500 Subject: [PATCH] Refs #35064 -- Made OrderableAggMixin avoid creating empty OrderByList. This paves the way for making OrderByList a simple shim over ExpressionList which requires at least a single item to be provided. --- django/contrib/postgres/aggregates/mixins.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/django/contrib/postgres/aggregates/mixins.py b/django/contrib/postgres/aggregates/mixins.py index 340a917879..68f24a5ce3 100644 --- a/django/contrib/postgres/aggregates/mixins.py +++ b/django/contrib/postgres/aggregates/mixins.py @@ -3,18 +3,21 @@ from django.db.models.expressions import OrderByList class OrderableAggMixin: def __init__(self, *expressions, ordering=(), **extra): - if isinstance(ordering, (list, tuple)): + if not ordering: + self.order_by = None + elif isinstance(ordering, (list, tuple)): self.order_by = OrderByList(*ordering) else: self.order_by = OrderByList(ordering) super().__init__(*expressions, **extra) def resolve_expression(self, *args, **kwargs): - self.order_by = self.order_by.resolve_expression(*args, **kwargs) + if self.order_by is not None: + self.order_by = self.order_by.resolve_expression(*args, **kwargs) return super().resolve_expression(*args, **kwargs) def get_source_expressions(self): - if self.order_by.source_expressions: + if self.order_by is not None: return super().get_source_expressions() + [self.order_by] return super().get_source_expressions() @@ -24,6 +27,9 @@ class OrderableAggMixin: return super().set_source_expressions(exprs) def as_sql(self, compiler, connection): - order_by_sql, order_by_params = compiler.compile(self.order_by) + if self.order_by is not None: + order_by_sql, order_by_params = compiler.compile(self.order_by) + else: + order_by_sql, order_by_params = "", () sql, sql_params = super().as_sql(compiler, connection, ordering=order_by_sql) return sql, (*sql_params, *order_by_params)