1234567891011121314151617181920212223242526272829 |
- from django.db.models.expressions import OrderByList
- class OrderableAggMixin:
- def __init__(self, *expressions, ordering=(), **extra):
- if 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)
- return super().resolve_expression(*args, **kwargs)
- def get_source_expressions(self):
- 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):
- if isinstance(exprs[-1], OrderByList):
- *exprs, self.order_by = exprs
- return super().set_source_expressions(exprs)
- def as_sql(self, compiler, connection):
- order_by_sql, order_by_params = compiler.compile(self.order_by)
- sql, sql_params = super().as_sql(compiler, connection, ordering=order_by_sql)
- return sql, (*sql_params, *order_by_params)
|