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

Django Rest Framework分页返回结果不一致如何解决

问题原因

你的分页类参数配置存在冲突:
PageNumberPagination 内置两个核心查询参数配置:

  • page_query_param:指定接收页码的URL查询参数名,默认值为 'page'
  • page_size_query_param:指定接收「客户端自定义每页条数」的URL查询参数名,默认值为 None,即默认不允许客户端随意修改每页返回条数

你错误地将 page_size_query_param 的值设为 'page',和默认的页码参数名完全重名。
这就导致你访问第二页传 ?page=2 时,框架会同时执行两个逻辑:

  1. 识别到当前请求页码为2,按规则计算分页偏移量
  2. 识别到客户端传入的自定义每页条数为2,直接覆盖你默认配置的page_size=10

最终第二页的切片规则为:偏移量 = (页码-1)*每页条数 = (2-1)*2 = 2,往后取2条数据,对应QuerySet的[2:4]切片,正好对应id为3、4的两条数据,和你遇到的异常现象完全吻合。第一页能正常返回10条,是因为你访问第一页时没有传page参数,框架默认取第1页,同时没有读到自定义页大小的参数值,就会使用默认配置的10条返回。

修复方案

两种方案选其一即可:

  1. 如果你不需要开放客户端自定义每页返回条数的能力,直接删掉冲突的配置行即可,固定每页返回10条:
class Pagination(PageNumberPagination):
    page_size = 10
    # 直接删除 page_size_query_param = 'page' 这行冲突配置
  1. 如果你需要支持客户端自定义每页返回条数,把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:03:23