首页 > 解决方案 > 为什么我的 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

在测试我是否设置正确时,我得到了我期望的结果,下一个链接和上一个链接为空。转到下一个链接后,我得到一个新的下一个链接、下一组结果和上一个链接。当我继续下一个链接时,我会得到与以前相同的上一个链接,但有下一个、下一个链接和下一组数据。不管我去多少次下一个,下一个链接上一个链接保持不变。

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

- 更新 -

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

标签: django-rest-frameworkdjango-pagination

解决方案


文档

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

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

推荐阅读