Django REST Framework提供了三种分页器:

  1. PageNumberPagination。基于Django Paginator封装,使得操作更方便,只需要做一些配置即可。分页方式:根据页数和每页的大小进行分页。
  2. LimitOffsetPagination。分页方式:从第几条开始找,向后找多少条。
  3. CursorPagination。实现比较复杂,有自己的特点。

说明:一般在分页前,需要先将数据排序。如果不排序,会报警告

PageNumberPagination

utils/pagination.py

from rest_framework.pagination import PageNumberPagination

class MyPagination(PageNumberPagination):
# 只需要做一些配置即可
page_size = 1 # 每页的数据量(默认)
page_query_param = "page" # 请求参数中的 page参数名
page_size_query_param = "size" # 请求参数中的 page_size参数名
max_page_size = 3 # 每页最大数量,请求参数中如果超过了这个配置,不会报错,会按照此配置工作 需要说明的是:我们配置的参数名,需要使用get请求。DRF在实现过程中只是针对get获取参数,如果需要其他方式传递参数(如post),需要自己修改源码。

views.py

from utils.pagination import MyPagination

class BookView(APIView):
def get(self, request):
book_list = Book.objects.all().order_by("id") # 实例化分页器对象
pageObj = MyPagination() # PageNumberPagination
# 调用分页方法
page_query = pageObj.paginate_queryset(book_list, request, view=self)
# 序列化器 many表示取出多条数据
ret = BookSeriallzer(page_query, myFields="__all__", many=True)
print(ret) resIO = pageObj.get_paginated_response(ret.data) # 获取分页的结果,将分页后的结果数据与Response封装在一起
# 将数据分为count,next,prev,result。分别是数据总量,上一页/下一页的请求地址,本页的数据 return resIO

LimitOffsetPagination

utils.pagination.py

class LimitPagination(LimitOffsetPagination):
'''需要我们规定:从第几条开始找,向后找多少条limit''' default_limit = 1 # 向后找几条的默认配置
limit_query_param = "limit" # 请求参数中的limit参数名
offset_query_param = "offset" # 请求参数中的offset参数名
max_limit = 3 # 最大的寻找条数 说明:参数的请求方法同上,get获取。

views.py

from utils.pagination import LimitPagination

class BookView(APIView):
def get(self, request):
book_list = Book.objects.all().order_by("id") # 实例化分页器对象
pageObj = LimitPagination() # LimitOffsetPagination
# 调用分页方法
page_query = pageObj.paginate_queryset(book_list, request, view=self)
# 序列化器 many表示取出多条数据
ret = BookSeriallzer(page_query, myFields="__all__", many=True)
print(ret) resIO = pageObj.get_paginated_response(ret.data) # 获取分页的结果,将分页后的结果数据与Response封装在一起
# 将数据分为count,next,prev,result。分别是数据总量,上一页/下一页的请求地址,本页的数据 return resIO

CursorPagination

游标分页。有时候,别人能够根据你的请求参数推断出你的数据库中有多少条数据,有些公司觉得这不够安全。使用次分页方式可以将游标进行加密,使人无法获知数据的数目。

特点:

  1. 分页前必须要排序
  2. 游标加密,不允许导航到任意位置(基于前两种的分页可以通过传参,对任意的页数发起请求,游标分页不允许),只能"next"和“prev”
  3. 支持非常大的数据集。如果表中有非常大的数据量,基于偏移的分页器效率变得很低,但基于游标分页的效率高。

utils/pagination.py

class CurPagination(CursorPagination):
'''游标分页'''
cursor_query_param = "cursor" # 游标请求参数,相当于page页数,但该数据是加密的,来自于上次分页返回
page_size = 2 # 默认每页显示的
ordering = "-id" # 排序 根据id倒序
max_page_size = 10 # 每页显示的最大条数

views.py

同上☝

Django REST Framework之分页器的更多相关文章

  1. DRF Django REST framework APIView(一)

    什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...

  2. 轻轻松松学会 DRF Django REST framework

    据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...

  3. django restful framework教程大全

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  4. Django REST Framework概述

    什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”.这里说的表征性,就是指资源,通 ...

  5. [Django REST framework - 自动生成接口文档、分页]

    [Django REST framework - 自动生成接口文档.分页] 自动生成接口文档 # 后端人员写好接口,编写接口文档,给前端人员看,前端人员依照接口文档开发 # 公司里主流 -后端,使用w ...

  6. Django REST framework完全入门

    Django REST framework 一个强大灵活的Django工具包,提供了便捷的 REST API 开发框架 我们用传统的django也可以实现REST风格的api,但是顶不住Django ...

  7. 使用django rest framework

    django 刚接触,想做一些restful api , google了一下,发现有现成的框架.Django REST framework. 对使用做下记录: 安装 从http://django-re ...

  8. 利用 Django REST framework 编写 RESTful API

    利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...

  9. django rest framework 入门

    django rest framework 入门1-序列化 Serialization 分类: Python 2013-01-22 22:24 11528人阅读 评论(0) 收藏 举报 djangop ...

随机推荐

  1. STL 最大堆与最小堆

    在第一场CCCC选拔赛上,有一关于系统调度的水题.利用优先队列很容易AC. // 由于比赛时花费了不少时间研究如何定义priority_queue的比较函数,决心把STL熟练掌握... Queue 首 ...

  2. java代码优化写法1(转摘)

    源文地址:https://blog.csdn.net/qq_15766297/article/details/70503222 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修 ...

  3. Python学习day35-并发编程(1)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. <Python基础>类和对象(初级)---烧开水的例子

    ''' 类:模板(模子) 类的名称:类名(人) 类的属性:一组数据(年龄,身高) 类的方法:进行操作的方法(走,跑,吃,喝) 对象:实体 类的抽象:把现实中的物品用类去表示 ''' #创建一个类 cl ...

  5. fastjson对Date类型的格式化

    @JSONField(format="yyyy-MM-dd HH:mm:ss.SSS") private Date sendMqDate; //MQ发送时间

  6. mysql TIMESTAMP 不能为NULL

    一般建表时候,创建时间用datetime,更新时间用timestamp.这是非常重要的. 我测试了一下,如果你的表中有两个timestamp字段,只要你更新任何非timestamp字段的值,则第一个t ...

  7. Ionic 选择图片上传

    1.添加插件 1.1 安装ngcordova 1.2 安装选择图片插件 1.3 安装上传插件 1.4查看安装插件集合 2.html 代码 <div class="item item-i ...

  8. jeecms 修改后台访问路径

       版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_30553235/article/details/74971414 我使用的是jeecms ...

  9. JDBC中DAO+service设计思想

    一.DAO设计思想 a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想. 高可读性. 高复用性. 高扩展性. b) JDBC代码实现的增删改查操作是有复用需 ...

  10. Vue.之.回到顶部

    Vue.之.回到顶部 当页面出现上下滚动条时,页面右下角出现回到顶部功能. 在页面上添加如下DIV(写的CSS内部样式),这个DIV功能:出现滚动条往下滑动,就显示出来,反之隐藏.点击DIV快速回到顶 ...