From da6579e5e47d1676a5619dab909f71297c87b2e2 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Mon, 11 Nov 2024 17:26:03 +0800 Subject: [PATCH] refactor: use `queryset._parse_orderings` for `order_by` --- tortoise/queryset.py | 64 ++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/tortoise/queryset.py b/tortoise/queryset.py index 01bc9e401..0034f8ba3 100644 --- a/tortoise/queryset.py +++ b/tortoise/queryset.py @@ -426,44 +426,6 @@ def exclude(self, *args: Q, **kwargs: Any) -> "QuerySet[MODEL]": """ return self._filter_or_exclude(negate=True, *args, **kwargs) - def order_by(self, *orderings: str) -> "QuerySet[MODEL]": - """ - Accept args to filter by in format like this: - - .. code-block:: python3 - - .order_by('name', '-tournament__name') - - Supports ordering by related models too. - A '-' before the name will result in descending sort order, default is ascending. - - :raises FieldError: If unknown field has been provided. - """ - queryset = self._clone() - new_ordering = [] - for ordering in orderings: - field_name, order_type = self._resolve_ordering_string(ordering) - - if not ( - field_name.split("__")[0] in self.model._meta.fields - or field_name in self._annotations - ): - raise FieldError(f"Unknown field {field_name} for model {self.model.__name__}") - new_ordering.append((field_name, order_type)) - queryset._orderings = new_ordering - return queryset - - def _single_queryset( - self, queryset=None, ordering: Optional[List[tuple]] = None - ) -> QuerySetSingle[Optional[MODEL]]: - if queryset is None: - queryset = self._clone() - if ordering is not None: - queryset._orderings = ordering - queryset._single = True - queryset._limit = 1 - return queryset - def _parse_orderings( self, orderings: Tuple[str, ...], reverse=False ) -> List[Tuple[str, Order]]: @@ -491,6 +453,32 @@ def _parse_orderings( new_ordering.append((field_name, order_type)) return new_ordering + def order_by(self, *orderings: str) -> "QuerySet[MODEL]": + """ + Accept args to filter by in format like this: + + .. code-block:: python3 + + .order_by('name', '-tournament__name') + + Supports ordering by related models too. + A '-' before the name will result in descending sort order, default is ascending. + + :raises FieldError: If unknown field has been provided. + """ + queryset = self._clone() + queryset._orderings = self._parse_orderings(orderings) if orderings else [] + return queryset + + def _single_queryset(self, queryset=None, ordering=None) -> QuerySetSingle[Optional[MODEL]]: + if queryset is None: + queryset = self._clone() + if ordering is not None: + queryset._orderings = ordering + queryset._single = True + queryset._limit = 1 + return queryset + def latest(self, *orderings: str) -> QuerySetSingle[Optional[MODEL]]: """ Returns the most recent object by ordering descending on the providers fields.