Django DRF 三种分页器配置与使用详解
本文详细介绍 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 分页器的技术资料,敬请关注本站后续文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









