Почему мой класс 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 ответ

Решение

Из документации

Правильное использование пагинации курсора должно иметь поле порядка, удовлетворяющее следующему:

  • Должно быть неизменным значением, таким как отметка времени, слаг или другое поле, которое устанавливается только один раз при создании.
  • Должен быть уникальным или почти уникальным. Отметки времени с точностью до миллисекунды являются хорошим примером. Эта реализация разбиения на курсоры использует умный стиль "позиция плюс смещение", который позволяет ему должным образом поддерживать не строго уникальные значения в качестве порядка.
  • Должно быть ненулевым значением, которое может быть приведено к строке.
Другие вопросы по тегам