From 45e66ec24eeb33dd8dcd59a886d22724371c624e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Clgen=20Sar=C4=B1kavak?= Date: Sun, 2 Nov 2025 14:00:11 +0300 Subject: [PATCH] Enforce ordering only when queryset is not ordered --- rest_framework/pagination.py | 9 +++++---- tests/test_pagination.py | 5 +++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py index b6329b8c3..bd55ea2d1 100644 --- a/rest_framework/pagination.py +++ b/rest_framework/pagination.py @@ -624,10 +624,11 @@ class CursorPagination(BasePagination): (offset, reverse, current_position) = self.cursor # Cursor pagination always enforces an ordering. - if reverse: - queryset = queryset.order_by(*_reverse_ordering(self.ordering)) - else: - queryset = queryset.order_by(*self.ordering) + if not queryset.ordered: + if reverse: + queryset = queryset.order_by(*_reverse_ordering(self.ordering)) + else: + queryset = queryset.order_by(*self.ordering) # If we have a cursor with a fixed position then filter by that. if current_position is not None: diff --git a/tests/test_pagination.py b/tests/test_pagination.py index d8f66e95b..63b897def 100644 --- a/tests/test_pagination.py +++ b/tests/test_pagination.py @@ -969,8 +969,9 @@ class TestCursorPagination(CursorPaginationTestsMixin): self.created = idx class MockQuerySet: - def __init__(self, items): + def __init__(self, items, ordered=False): self.items = items + self.ordered = ordered def filter(self, created__gt=None, created__lt=None): if created__gt is not None: @@ -987,7 +988,7 @@ class TestCursorPagination(CursorPaginationTestsMixin): def order_by(self, *ordering): if ordering[0].startswith('-'): - return MockQuerySet(list(reversed(self.items))) + return MockQuerySet(list(reversed(self.items)), ordered=True) return self def __getitem__(self, sliced):