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

Django Rest Framework配置PageNumberPagination后page_size参数不生效问题

问题根因

  1. DRF默认的PageNumberPagination类未开启page_size查询参数支持,仅会读取全局配置的PAGE_SIZE作为固定单页返回条数
  2. 全局未配置PAGE_SIZE参数时,DRF默认不触发分页逻辑,直接返回全量数据

解决方案

1. 自定义分页类

继承PageNumberPagination,开启动态page_size参数支持,可直接在views.py中定义,也可以存放在通用工具文件中:

from rest_framework.pagination import PageNumberPagination

class DynamicPageSizePagination(PageNumberPagination):
    # 指定url中控制单页条数的参数名,和你请求中用的page_size保持一致即可
    page_size_query_param = 'page_size'
    # 可选配置:设置单页最大返回条数,避免恶意请求过大导致服务异常
    max_page_size = 100
    # 可选配置:设置默认单页返回条数,优先级高于全局settings中的PAGE_SIZE
    # page_size = 10

2. 替换分页类配置

两种配置方式按需选择:

全局生效(所有接口默认使用该分页规则)

修改settings.py中的REST_FRAMEWORK配置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    # 替换为你自定义分页类的实际导入路径
    'DEFAULT_PAGINATION_CLASS': '你的项目路径.DynamicPageSizePagination',
    # 全局默认单页条数,可保留
    'PAGE_SIZE':10
}

配置完成后所有继承ListAPIView的视图无需单独配置pagination_class即可自动支持动态page_size参数。

仅指定视图生效

不需要修改全局配置,直接在对应视图中指定自定义分页类即可:

class GrnListAPIView(generics.ListAPIView):
    serializer_class = GrnListSerializer
    # 替换为自定义的分页类
    pagination_class = DynamicPageSizePagination
    permission_classes = (permissions.IsAuthenticated, GRNViewPermission)

    def get_queryset(self):
        return Grn.objects.all()

3. 效果验证

配置完成后请求http://localhost:8000/grns/?page=1&page_size=20即可返回对应页数的20条数据,请求的page_size超过max_page_size配置时,会自动限制为max_page_size的设定值。

内容的提问来源于stack exchange,提问作者Rahul Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:24:03