mixins.py 1.2 KB

1234567891011121314151617181920212223242526272829
  1. from django.db.models.expressions import OrderByList
  2. class OrderableAggMixin:
  3. def __init__(self, *expressions, ordering=(), **extra):
  4. if isinstance(ordering, (list, tuple)):
  5. self.order_by = OrderByList(*ordering)
  6. else:
  7. self.order_by = OrderByList(ordering)
  8. super().__init__(*expressions, **extra)
  9. def resolve_expression(self, *args, **kwargs):
  10. self.order_by = self.order_by.resolve_expression(*args, **kwargs)
  11. return super().resolve_expression(*args, **kwargs)
  12. def get_source_expressions(self):
  13. if self.order_by.source_expressions:
  14. return super().get_source_expressions() + [self.order_by]
  15. return super().get_source_expressions()
  16. def set_source_expressions(self, exprs):
  17. if isinstance(exprs[-1], OrderByList):
  18. *exprs, self.order_by = exprs
  19. return super().set_source_expressions(exprs)
  20. def as_sql(self, compiler, connection):
  21. order_by_sql, order_by_params = compiler.compile(self.order_by)
  22. sql, sql_params = super().as_sql(compiler, connection, ordering=order_by_sql)
  23. return sql, (*sql_params, *order_by_params)