Django Rest Framework分页返回结果不一致如何解决
问题原因
你的分页类参数配置存在冲突:PageNumberPagination 内置两个核心查询参数配置:
page_query_param:指定接收页码的URL查询参数名,默认值为'page'page_size_query_param:指定接收「客户端自定义每页条数」的URL查询参数名,默认值为None,即默认不允许客户端随意修改每页返回条数
你错误地将 page_size_query_param 的值设为 'page',和默认的页码参数名完全重名。
这就导致你访问第二页传 ?page=2 时,框架会同时执行两个逻辑:
- 识别到当前请求页码为2,按规则计算分页偏移量
- 识别到客户端传入的自定义每页条数为2,直接覆盖你默认配置的
page_size=10
最终第二页的切片规则为:偏移量 = (页码-1)*每页条数 = (2-1)*2 = 2,往后取2条数据,对应QuerySet的[2:4]切片,正好对应id为3、4的两条数据,和你遇到的异常现象完全吻合。第一页能正常返回10条,是因为你访问第一页时没有传page参数,框架默认取第1页,同时没有读到自定义页大小的参数值,就会使用默认配置的10条返回。
修复方案
两种方案选其一即可:
- 如果你不需要开放客户端自定义每页返回条数的能力,直接删掉冲突的配置行即可,固定每页返回10条:
class Pagination(PageNumberPagination): page_size = 10 # 直接删除 page_size_query_param = 'page' 这行冲突配置
- 如果你需要支持客户端自定义每页返回条数,把
page_size_query_param改成不冲突的参数名即可,行业通用命名为page_size:
class Pagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' # 注意不要和页码参数page重名 # 可选配置:限制客户端可设置的最大每页条数,避免单次拉取数据量过大 max_page_size = 100
修改完成后分页逻辑即可恢复正常,第二页会正确返回id11-20的10条数据,每页返回数量保持一致。
内容的提问来源于stack exchange,提问作者Gagan
相关产品推荐
相关产品推荐

