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

如何为Django的CursorPagination添加skip参数实现跳过指定条目功能

实现方案

你不需要重写完整的分页类,只需要继承DRF自带的CursorPagination类,扩展少量逻辑即可实现自定义skip参数功能:

步骤1:自定义分页类

首先继承CursorPagination,新增skip参数的解析和偏移逻辑:

from rest_framework.pagination import CursorPagination

class CustomSkipCursorPagination(CursorPagination):
    # 自定义skip查询参数名,可根据业务需求修改
    skip_query_param = 'skip'

    def paginate_queryset(self, queryset, request, view=None):
        # 解析请求中的skip参数
        skip_count = request.query_params.get(self.skip_query_param, 0)
        try:
            skip_count = int(skip_count)
            # 合法性校验,避免负数或过大偏移带来的性能问题
            if skip_count < 0:
                skip_count = 0
            # 可根据业务场景调整最大跳过阈值
            if skip_count > 1000:
                skip_count = 1000
        except (ValueError, TypeError):
            skip_count = 0

        # 先执行原生游标分页逻辑获取分页结果
        paginated = super().paginate_queryset(queryset, request, view)

        # 对分页结果做skip偏移
        if skip_count > 0 and paginated is not None:
            paginated = paginated[skip_count:]
            # 同步更新page_size,避免前端计数错误
            self.page_size = max(self.page_size - skip_count, 0)

        return paginated

步骤2:在视图中引用自定义分页类

在对应接口的视图类中指定pagination_class即可生效:

from rest_framework.viewsets import ModelViewSet
from .models import YourMongoModel
from .serializers import YourModelSerializer

class YourModelViewSet(ModelViewSet):
    queryset = YourMongoModel.objects.all()
    serializer_class = YourModelSerializer
    pagination_class = CustomSkipCursorPagination

可选优化:保留分页链接的skip参数

如果需要让返回的next/previous分页链接自动携带当前的skip参数,可以额外重写两个链接生成方法:

def get_next_link(self):
    link = super().get_next_link()
    if link and self.skip_query_param in self.request.query_params:
        skip_val = self.request.query_params[self.skip_query_param]
        link += f"&{self.skip_query_param}={skip_val}"
    return link

def get_previous_link(self):
    link = super().get_previous_link()
    if link and self.skip_query_param in self.request.query_params:
        skip_val = self.request.query_params[self.skip_query_param]
        link += f"&{self.skip_query_param}={skip_val}"
    return link

注意事项

  • 如果你使用Djongo等Django MongoDB驱动,查询集的切片操作会自动转换为MongoDB原生的skip方法执行,不会在应用层做内存过滤
  • 游标分页的设计初衷是避免大偏移的性能损耗,过大的skip值依然会引发性能问题,建议严格控制最大skip阈值

内容的提问来源于stack exchange,提问作者Fez Vrasta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 09:15:02