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
相关产品推荐
相关产品推荐

