Skip to content

Commit e03bd60

Browse files
committed
Return queryset's ordering from .get_ordering()
1 parent 24b2652 commit e03bd60

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

rest_framework/pagination.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from django.core.paginator import InvalidPage
1313
from django.core.paginator import Paginator as DjangoPaginator
14+
from django.db.models import OrderBy
1415
from django.template import loader
1516
from django.utils.encoding import force_str
1617
from django.utils.translation import gettext_lazy as _
@@ -615,7 +616,7 @@ def paginate_queryset(self, queryset, request, view=None):
615616
return None
616617

617618
self.base_url = request.build_absolute_uri()
618-
self.ordering = self.get_ordering()
619+
self.ordering = self.get_ordering(queryset)
619620

620621
self.cursor = self.decode_cursor(request)
621622
if self.cursor is None:
@@ -802,10 +803,36 @@ def get_previous_link(self):
802803
cursor = Cursor(offset=offset, reverse=True, position=position)
803804
return self.encode_cursor(cursor)
804805

805-
def get_ordering(self):
806+
def get_ordering_from_queryset(self, queryset):
807+
if not queryset.ordered:
808+
return False
809+
810+
qs_ordering = queryset.query.order_by
811+
812+
# Fallback to model's Meta ordering if no order_by is given
813+
if not qs_ordering:
814+
qs_ordering = queryset.query.get_meta().ordering
815+
816+
ordering = []
817+
for expr in qs_ordering:
818+
if isinstance(expr, str):
819+
ordering.append(expr)
820+
821+
elif isinstance(expr, OrderBy):
822+
field_name = expr.expression.name
823+
descending = expr.descending
824+
ordering.append(f"{'-' if descending else ''}{field_name}")
825+
826+
return ordering
827+
828+
def get_ordering(self, queryset):
806829
"""
807830
Return a tuple of strings, that may be used in an `order_by` method.
808831
"""
832+
# Return the ordering value from the queryset if it has one.
833+
if queryset.ordered:
834+
return self.get_ordering_from_queryset(queryset)
835+
809836
ordering = self.ordering
810837

811838
assert ordering is not None, (

0 commit comments

Comments
 (0)