drf之分页器

简介

当数据量过大时,传给前端的数据就需要做分页处理,一次传入一部分数据。
drf自带的分页器总共有三种:
PageNumberPagination 最常用分页器
LimitOffsetPagination 偏移分页器
CursorPagination 游标分页器

使用方法

  1. 视图类必须继承GenericAPIView
  2. 需要自定义分页器再使用
  3. 在视图层导入,并使用 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对每个查询进行基于游标的分页,从而快速、简便地处理大量数据。

posted @   树苗叶子  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示