为什么我的CursorPagination类总是返回相同的上一个链接?

时间:2018-06-11 22:44:08

标签: django-rest-framework django-pagination

尝试对大型查询集进行分页,这样即使数据已添加到数据库中,我也可以返回到之前的相同位置。

目前我作为我的分页班:

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

在测试我是否正确设置时,我得到的结果是我期望的下一个链接和前一个链接的null。 转到下一个链接后,我会看到一个新的下一个链接,下一组结果和一个上一个链接。 当我继续下一个链接时,我得到与之前相同的前一个链接,但是使用下一个,下一个链接和下一组数据。 无论我多少次进入下一个链接,下一个链接都保持不变。

为什么之前的链接没有更新?

- 更新 -

看起来我的问题的原因是我在同一天有很多消息。按日期排序,它会尝试返回当前光标之前的日期。我如何按日期订购,但是像使用ids那样使用光标分页逐步浏览列表?

1 个答案:

答案 0 :(得分:0)

来自Documentation

正确使用游标分页应该有一个满足以下条件的排序字段:

  • 应该是一个不变的值,例如时间戳,slug或其他仅在创建时设置一次的字段。
  • 应该是独一无二的,或几乎是独一无二的。毫秒精度时间戳就是一个很好的例子。光标分页的这种实现使用智能的“位置加偏移”样式,允许它正确支持非严格唯一值作为排序。
  • 应该是一个可以强制转换为字符串的非可空值。