Почему мой класс CursorPagination всегда возвращает одну и ту же предыдущую ссылку?
Попытка разбить на страницы большой набор запросов, чтобы я мог вернуться в ту же позицию, в которой находился ранее, даже если данные были добавлены в базу данных.
В настоящее время у меня в качестве класса пагинации:
from rest_framework.pagination import CursorPagination
class MessageCursorPagination(CursorPagination):
page_size = 25
ordering = '-date'
На мой взгляд, у меня есть:
from rest_framework.generics import GenericAPIView
from rest_framework.authentication import TokenAuthentication, BasicAuthentication
class MessageViewSet(GenericAPIView):
permission_classes = (IsAuthenticated, )
authentication_classes = (TokenAuthentication,)
pagination_class = pagination.MessageCursorPagination
serializer_class = serializers.MessageSerializer
def get(self, request, **kwargs):
account_id = kwargs.get('account_id', None)
messages = models.Message.objects.filter(
account=account_id)
paginated_messages = self.paginate_queryset(messages)
results = self.serializer_class(paginated_messages, many=True).data
response = self.get_paginated_response(results)
return response
При тестировании, чтобы увидеть, правильно ли я настроил, я получил ожидаемые результаты со следующей ссылкой и нулем для предыдущей ссылки. После перехода к следующей ссылке я получаю новую следующую ссылку, следующий набор результатов и предыдущую ссылку. При переходе к следующей ссылке я получаю ту же предыдущую ссылку, что и раньше, но со следующей, следующей ссылкой и следующим набором данных. Независимо от того, сколько раз я перехожу к следующей ссылке, предыдущая ссылка остается прежней.
Почему предыдущая ссылка не обновляется?
-- Обновить --
Похоже, причина моей проблемы в том, что у меня много сообщений в один и тот же день. Упорядочивая по дате, он пытается вернуться к дате перед текущим курсором. Как я могу упорядочить по дате, но пошагово пройти по списку, используя нумерацию курсора, как если бы я использовал ids?
1 ответ
Из документации
Правильное использование пагинации курсора должно иметь поле порядка, удовлетворяющее следующему:
- Должно быть неизменным значением, таким как отметка времени, слаг или другое поле, которое устанавливается только один раз при создании.
- Должен быть уникальным или почти уникальным. Отметки времени с точностью до миллисекунды являются хорошим примером. Эта реализация разбиения на курсоры использует умный стиль "позиция плюс смещение", который позволяет ему должным образом поддерживать не строго уникальные значения в качестве порядка.
- Должно быть ненулевым значением, которое может быть приведено к строке.