Django DRF 三种分页器配置与使用详解

追风的人
追风的人
发布时间:2026-10-14 | 6人浏览过
原创

本文详细介绍 Django REST Framework 中三种分页器的配置与使用。涵盖基础分页 PageNumberPagination 的全局与局部配置、偏移分页 LimitOffsetPagination 的 limit 与 offset 参数逻辑,以及高性能游标分页 CursorPagination 的安全性与排序要求。包含完整代码示例及 URL 调用方式,帮助开发者根据数据量与性能需求选择合适的分页策略。

前言

当后端返回的数据量过大时,必须引入分页机制以优化性能,例如限制每页仅展示 10 条记录。在 drf 框架中,默认提供了三种分页器供开发者选择。

  • PageNumberPagination:基础分页器,性能随数据量增加而下降
  • LimitOffsetPagination:基于偏移量的分页器
  • CursorPagination:游标分页器,具备高性能与高安全性

PageNumberPagination

基础分页器 PageNumberPagination 在数据量较小且数据库记录较少时表现良好,但随着数据规模增大,其性能会显著降低。

首先,在 app 目录下创建 pagination.py 文件,并在此定义一个自定义分页类,该类需继承自 PageNumberPagination:


from rest_framework.pagination import PageNumberPagination
class MyPageNumberPagination(PageNumberPagination):
    """
    普通分页,数据量越大性能越差
    """
    # 默认页面展示的条数
    page_size = 3
    # 前端访问url需要添加 ?page=页码
    page_query_param = 'page'
    # 用户自定义返回的条数,格式?page_size=页数
    page_size_query_param = "page_size"
    # 用户自定义返回的条数最大限制,数值超过5也只展示5条
    max_page_size = 5

若需进行局部配置,只需在对应的类视图中指定 pagination_class = MyPageNumberPagination 即可。 若需进行全局配置,请在 settings.py 文件中添加如下设置:


REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'api.pagination.MyPageNumberPagination',
}

配置完成后,访问 url 时只需在 URL 后追加 ?page=页码数 参数即可。 例如访问 http://127.0.0.1:8000/api/cars/?page=2,表示获取第 2 页的数据,默认每页显示条数由 page_size 参数决定。 又如访问 http://127.0.0.1:8000/api/cars/?page=2&page_size=5,表示获取第 2 页数据,且用户自定义每页显示 5 条记录。

LimitOffsetPagination

首先自定义一个分页器类,继承自 LimitOffsetPagination:


class MyLimitOffsetPagination(LimitOffsetPagination):
    # url后面跟limit请求参数,
    limit_query_param = 'limit'
    # url后面跟offset请求参数
    offset_query_param = 'offset'
    # 最大限制20条
    max_limit = 20
    # 默认限制3条
    default_limit = 3

随后访问 url 时,只需在 URL 后追加 ?limit=10 参数。 例如访问 http://127.0.0.1/api/cars/?limit=10,表示限制最多展示 10 条数据。如果设置的 limit 值大于 max_limit,则实际展示条数仍受限于 max_limit 的最大值。 再如访问 http://127.0.0.1/api/cars/?offset=1,此处未指定 limit 参数,因此默认展示 3 条数据。offset=1 参数用于指定从数据库列表中提取数据的起始下标。假设原始数据列表为 ['test1', 'test2', 'test3', 'test4'],默认情况下提取前 3 条;若加上 offset=1 参数,则从下标为 1 的位置开始提取,最终获取的数据为 test2、test3 和 test4。

CursorPagination

游标分页器的用法与基础分页器类似,但其核心优势在于对下一页数据的 url 进行了加密处理,从而提升了安全性与性能。 首先自定义一个分页器类,继承自 CursorPagination:


class MyCursorPagination(CursorPagination):
    """
    Cursor 光标分页 性能高,安全
    """
    page_size = 10
    page_size_query_param = "page_size"
    max_page_size = 20
    ordering = '-price'

如果视图中使用了排序过滤 filter_backends = [OrderingFilter],那么在访问 url 时必须携带 ?ordering=需要排序的字段 参数,否则可能导致分页结果不一致。

以上即为 Django DRF 中三种分页器的详细配置与使用指南,更多关于 Django DRF 分页器的技术资料,敬请关注本站后续文章。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表