Skip to content

Commit 9323905

Browse files
committed
Enforce ordering only when queryset is not ordered
1 parent f55e8b9 commit 9323905

File tree

2 files changed

+8
-6
lines changed

2 files changed

+8
-6
lines changed

rest_framework/pagination.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,10 +624,11 @@ def paginate_queryset(self, queryset, request, view=None):
624624
(offset, reverse, current_position) = self.cursor
625625

626626
# 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)
627+
if not queryset.ordered:
628+
if reverse:
629+
queryset = queryset.order_by(*_reverse_ordering(self.ordering))
630+
else:
631+
queryset = queryset.order_by(*self.ordering)
631632

632633
# If we have a cursor with a fixed position then filter by that.
633634
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)