You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF使用CursorPagination出现IndexError元组索引越界问题如何解决

问题原因
  • DRF CursorPagination 组件的 ordering 配置项要求必须为列表或元组类型,即使仅设置单个排序字段,也不可直接传入字符串。当前代码中 ordering = '-created_at' 为字符串类型,不符合组件参数规范。
  • 当数据量小于等于分页大小page_size时,分页逻辑无需生成下一页游标,不会执行到ordering[0]取值的代码分支,因此不会触发报错;当数据量超过page_size需要生成游标时,组件内部会按序列类型逻辑读取ordering的第一个元素,此时字符串类型的ordering会导致取值逻辑异常,最终抛出索引越界错误。
修复方案

将CursorSetPagination类中的ordering配置改为元组或列表类型即可:

class CursorSetPagination(CursorPagination):
    page_size = 10
    page_size_query_param = 'page_size'
    # 元组写法,注意末尾逗号不可省略,否则仍会被识别为单个字符串
    ordering = ('-created_at',)
    # 也可使用列表写法:ordering = ['-created_at']

如果视图同时配置了OrderingFilter允许用户自定义排序字段,需要补充默认排序配置,避免用户传入空排序参数覆盖分页配置:

class WalletCreditViewset(viewsets.ReadOnlyModelViewSet):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]
    pagination_class = CursorSetPagination 
    serializer_class =  WalletCreditSerializer
    # 补充默认排序兜底
    ordering = ['-created_at']

    def get_queryset(self):
        queryset = PaymentOrder.objects.filter(user=self.request.user)
        return queryset

内容的提问来源于stack exchange,提问作者suraj sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:18:04