drf之分页器
简介
当数据量过大时,传给前端的数据就需要做分页处理,一次传入一部分数据。
drf自带的分页器总共有三种:
PageNumberPagination 最常用分页器
LimitOffsetPagination 偏移分页器
CursorPagination 游标分页器
使用方法
- 视图类必须继承GenericAPIView
- 需要自定义分页器再使用
- 在视图层导入,并使用 pagination_class 调用,注意对应的不是列表
视图层调用
from app01.page import CommonPageNumberPagination, CommonCursorPagination, CommonLimitOffsetPagination
class BookView(ViewSetMixin, ListAPIView):
queryset = models.Book.objects.all()
serializer_class = BookModelSerializer
# 三个分页器只能选其一使用,不可以混合使用,这也是为什么参数不是列表
pagination_class = CommonPageNumberPagination
PageNumberPagination
创建page.py
from rest_framework.pagination import PageNumberPagination
class CommonPageNumberPagination(PageNumberPagination):
page_size = 2 # 当没有传入page_query_param参数时,默认每页显示多少条数据
page_query_param = 'page' # 定义前端查询参数,这里是page前端就是http://127.0.0.1/?page=xx
page_size_query_param = 'size' # 前端自定义显示条数,这里是size,前端就是http://127.0.0.1/?page=1&size=5 显示第1页并且显示5条数据
max_page_size = 5 # 定制每页显示最大条数
CursorPagination
class CommonLimitOffsetPagination(LimitOffsetPagination):
default_limit = 3 # 在没有传入limit_query_param参数时,默认每页显示多少条
limit_query_param = 'limit' # 表示可以通过URL参数指定每一页显示的数量limit=10表示每页显示10条
# offset 意为从第几个元素开始返回,它与 limit 共同用于确定需要返回的子集内容。offset 的值通常用于计算从指定位置开始的查询结果。例如,如果你有所有新闻文章的结果集,但是你想跳过前10条结果并仅返回从第11个新闻文章开始的下20个结果,那么 offset 为10, limit 为20。
# 比如数据为:1号 2号 3号 4号 5号,offset=3&limit=1,先偏移三条数据,再取1条数据,所以取值为“4号”
offset_query_param = 'offset' # 表示偏移量,比如offset=1
max_limit = 5 # 最大显示条数
LimitOffsetPagination
优点:速度快
缺点:无法随意到达某一页
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询参数
page_size = 2 # 每页多少条
ordering = 'id' # 排序字段
以下是详细说明:
在Python的Django框架中,Django Rest Framework (DRF)是一个常用的第三方库,用于方便地创建Restful Web API。其中,CursorPagination是DRF中用于分页的一个功能。它与传统的基于页码的分页方式不同,基于游标的分页方式允许在大的数据集中处理更深入的分页。
通过CursorPagination,你可以使用游标而不是页码来处理分页,这样可以更好地优化性能并产生更准确的结果。CursorPagination允许客户端在查询结果集中的指定位置检索数据,而不是根据页码检索数据。 这意味着即使有大量数据,分页也会更快。例如,当快速添加或插入新数据时,可以使用CursorPagination保持正确的分页状态。它还支持按照多个字段排序并实现“下一页”和“上一页”的功能。
要使CursorPagination可用于DRF视图,必须将其添加为分页类的一部分。以下是一个示例代码,演示如何使用CursorPagination:
from rest_framework import pagination
class MyCursorPagination(pagination.CursorPagination):
page_size = 10
ordering = '-created_at'
cursor_query_param = 'cursor'
其中,定义了一个名为MyCursorPagination的类,继承自CursorPagination。其中,page_size属性定义了每个页面的大小,ordering属性定义了查询结果集的默认排序方式,cursor_query_param用于定义查询参数的名称。在视图中调用分页器时,只需要简单地将类实例化并将其传递给分页器参数即可:
class MyView(viewsets.ViewSet):
pagination_class = MyCursorPagination
...
这样,MyView视图就可以使用CursorPagination对每个查询进行基于游标的分页,从而快速、简便地处理大量数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类