Django Rest Framework配置PageNumberPagination后page_size参数不生效问题
问题根因
- DRF默认的
PageNumberPagination类未开启page_size查询参数支持,仅会读取全局配置的PAGE_SIZE作为固定单页返回条数 - 全局未配置
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
相关产品推荐
相关产品推荐

