如何为DRF可浏览API单独配置独立的PAGE_SIZE分页参数
解决方案
完全可以实现,只需要自定义一个能识别请求渲染器类型的分页类,替换全局默认分页配置即可,对现有业务逻辑零侵入。
具体实现步骤
- 编写自定义分页类
在你的项目公共模块(比如新建common/pagination.py文件)中写入以下代码:
from rest_framework.pagination import PageNumberPagination from rest_framework.renderers import BrowsableAPIRenderer class DualConfigPageNumberPagination(PageNumberPagination): # 常规API调用(程序请求JSON/XML等格式数据)使用的分页大小 page_size = 10000 # 可浏览API(浏览器访问可视化界面)专用分页大小 browsable_page_size = 100 def get_page_size(self, request): # 识别当前请求使用的渲染器,如果是可浏览API渲染器就返回专用分页值 if isinstance(request.accepted_renderer, BrowsableAPIRenderer): return self.browsable_page_size return super().get_page_size(request)
这里的browsable_page_size你可以根据自己的页面加载需求调整数值,比如设为50、200都可以。
- 修改全局配置替换默认分页类
打开settings.py,修改REST_FRAMEWORK配置项,把原来的DEFAULT_PAGINATION_CLASS替换为你自定义的分页类路径,同时可以删掉原来写死的全局PAGE_SIZE参数:
REST_FRAMEWORK = { "DEFAULT_AUTHENTICATION_CLASSES": [ "rest_framework.authentication.SessionAuthentication", "rest_framework.authentication.TokenAuthentication", ], "DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"], # 替换为你自定义的分页类路径,按实际存放位置调整 "DEFAULT_PAGINATION_CLASS": "common.pagination.DualConfigPageNumberPagination", }
补充说明
- 这个方案不会影响你在单个视图/视图集上单独配置分页参数的逻辑,如果某个接口需要特殊分页大小,直接在视图类上设置
page_size或者指定单独的paginator_class即可,优先级高于全局配置。 - 判断逻辑基于DRF的渲染器匹配规则,只有当请求最终返回的是可浏览API的HTML页面时,才会启用小分页,所有程序调用API获取结构化数据的场景仍然会保持10000条的分页大小,完全不影响原有接口性能。
- 如果你希望分页数值统一在settings里维护,也可以把两个分页大小的数值定义为settings常量,在分页类里通过
django.conf.settings读取即可,后续调整更方便。
内容的提问来源于stack exchange,提问作者Cord Kaldemeyer
相关产品推荐
相关产品推荐

