Skip to content

Commit 018de3b

Browse files
committed
Enforce ordering only when queryset is not ordered
1 parent 1660c22 commit 018de3b

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

rest_framework/pagination.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,6 @@ def paginate_queryset(self, queryset, request, view=None):
615615
return None
616616

617617
self.base_url = request.build_absolute_uri()
618-
self.ordering = self.get_ordering(request, queryset, view)
619618

620619
self.cursor = self.decode_cursor(request)
621620
if self.cursor is None:
@@ -624,10 +623,13 @@ def paginate_queryset(self, queryset, request, view=None):
624623
(offset, reverse, current_position) = self.cursor
625624

626625
# Cursor pagination always enforces an ordering.
627-
if reverse:
628-
queryset = queryset.order_by(*_reverse_ordering(self.ordering))
629-
else:
630-
queryset = queryset.order_by(*self.ordering)
626+
if not queryset.ordered:
627+
self.ordering = self.get_ordering(request, queryset, view)
628+
629+
if reverse:
630+
queryset = queryset.order_by(*_reverse_ordering(self.ordering))
631+
else:
632+
queryset = queryset.order_by(*self.ordering)
631633

632634
# If we have a cursor with a fixed position then filter by that.
633635
if current_position is not None:

tests/test_pagination.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -969,8 +969,9 @@ def __init__(self, idx):
969969
self.created = idx
970970

971971
class MockQuerySet:
972-
def __init__(self, items):
972+
def __init__(self, items, ordered=False):
973973
self.items = items
974+
self.ordered = ordered
974975

975976
def filter(self, created__gt=None, created__lt=None):
976977
if created__gt is not None:
@@ -987,7 +988,7 @@ def filter(self, created__gt=None, created__lt=None):
987988

988989
def order_by(self, *ordering):
989990
if ordering[0].startswith('-'):
990-
return MockQuerySet(list(reversed(self.items)))
991+
return MockQuerySet(list(reversed(self.items)), ordered=True)
991992
return self
992993

993994
def __getitem__(self, sliced):

0 commit comments

Comments
 (0)