django-rest-framework - 为什么我的 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 一样使用光标分页逐步浏览列表?
解决方案
从文档
正确使用游标分页应该有一个满足以下条件的排序字段:
- 应该是一个不变的值,例如时间戳、slug 或其他在创建时只设置一次的字段。
- 应该是独一无二的,或者几乎是独一无二的。毫秒精度时间戳就是一个很好的例子。光标分页的这种实现使用了一种智能的“位置加偏移”样式,允许它正确支持非严格唯一值作为排序。
- 应该是可以强制转换为字符串的不可空值。
推荐阅读
- ios - 添加 SwiftUI ListView,它允许拉取刷新功能和分页
- python - 使用 Python (BeautifulSoup) 处理字典和网页抓取
- plot - 如何在 Julia 中使用时间数据获得更好的 Plots.jl xaxis 刻度标签?
- javascript - 为 AWS CDK 堆栈中的阶段分配不同的 Lambda 函数
- shell - ping 脚本 - 主机关闭与主机不在网络上
- c# - 为什么 Enumerable.Aggregate 存在 resultSelector 重载?
- postgresql - 朱利安日期 (YYYYDDD) 到 YYYYMMDD Postgresql
- java - 从 Java 代码传递空格分隔的字符串作为参数以执行 Python 代码
- ios - 配置文件“iOS Team Provisioning Profile: com.*****.******”不包括当前选择的设备“****'s MacBook Pro”
- javascript - 操纵 API 响应以显示有组织的列表