Skip to content

Commit

Permalink
refactor: use queryset._parse_orderings for order_by
Browse files Browse the repository at this point in the history
  • Loading branch information
waketzheng committed Nov 11, 2024
1 parent 40f2932 commit da6579e
Showing 1 changed file with 26 additions and 38 deletions.
64 changes: 26 additions & 38 deletions tortoise/queryset.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]]:
Expand Down Expand Up @@ -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.
Expand Down

0 comments on commit da6579e

Please sign in to comment.