Return queryset's ordering from .get_ordering()

This commit is contained in:
Ülgen Sarıkavak 2025-11-04 14:41:59 +03:00
parent 77612482af
commit 64647c0ca5

View File

@ -11,6 +11,7 @@ from urllib import parse
from django.core.paginator import InvalidPage from django.core.paginator import InvalidPage
from django.core.paginator import Paginator as DjangoPaginator from django.core.paginator import Paginator as DjangoPaginator
from django.db.models import OrderBy
from django.template import loader from django.template import loader
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -615,7 +616,7 @@ class CursorPagination(BasePagination):
return None return None
self.base_url = request.build_absolute_uri() self.base_url = request.build_absolute_uri()
self.ordering = self.get_ordering() self.ordering = self.get_ordering(queryset)
self.cursor = self.decode_cursor(request) self.cursor = self.decode_cursor(request)
if self.cursor is None: if self.cursor is None:
@ -802,10 +803,36 @@ class CursorPagination(BasePagination):
cursor = Cursor(offset=offset, reverse=True, position=position) cursor = Cursor(offset=offset, reverse=True, position=position)
return self.encode_cursor(cursor) return self.encode_cursor(cursor)
def get_ordering(self): def get_ordering_from_queryset(self, queryset):
if not queryset.ordered:
return False
qs_ordering = queryset.query.order_by
# Fallback to model's Meta ordering if no order_by is given
if not qs_ordering:
qs_ordering = queryset.query.get_meta().ordering
ordering = []
for expr in qs_ordering:
if isinstance(expr, str):
ordering.append(expr)
elif isinstance(expr, OrderBy):
field_name = expr.expression.name
descending = expr.descending
ordering.append(f"{'-' if descending else ''}{field_name}")
return ordering
def get_ordering(self, queryset):
""" """
Return a tuple of strings, that may be used in an `order_by` method. Return a tuple of strings, that may be used in an `order_by` method.
""" """
# Return the ordering value from the queryset if it has one.
if queryset.ordered:
return self.get_ordering_from_queryset(queryset)
ordering = self.ordering ordering = self.ordering
assert ordering is not None, ( assert ordering is not None, (