Skip to content

Commit a8b6130

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

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

rest_framework/pagination.py

Lines changed: 18 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,25 @@ 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(self, queryset):
806807
"""
807808
Return a tuple of strings, that may be used in an `order_by` method.
808809
"""
810+
# Return the ordering value from the queryset if it has one.
811+
if queryset.ordered:
812+
ordering = []
813+
814+
for expr in queryset.query.order_by:
815+
if isinstance(expr, str):
816+
ordering.append(expr)
817+
818+
elif isinstance(expr, OrderBy):
819+
field_name = expr.expression.name
820+
descending = expr.descending
821+
ordering.append(f"{'-' if descending else ''}{field_name}")
822+
823+
return ordering
824+
809825
ordering = self.ordering
810826

811827
assert ordering is not None, (

0 commit comments

Comments
 (0)