Почему мой класс CursorPagination всегда возвращает одну и ту же предыдущую ссылку? - PullRequest
0 голосов
/ 12 июня 2018

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

В настоящее время у меня есть класс пагинации:

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 Ответ

0 голосов
/ 13 июня 2018

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

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

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