8、DRF实战总结:分页(Pagination)及DRF提供的分页类详解(附源码)

news2024/11/24 18:39:58

在前面的DRF系列教程中,以博客为例介绍了序列化器, 使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口,并详细对权限和认证(含jwt认证)进行了总结与演示。在本篇文章中将向演示如何在Django REST Framework中使用分页。

参考文章:

3、DRF实战总结:基于类的视图APIView, GenericAPIView和GenericViewSet视图集(附源码)_SteveRocket的博客-CSDN博客

4、DRF实战总结:序列化器(Serializer)、数据验证、重写序列化器方法详解(附源码)_SteveRocket的博客-CSDN博客

https://blog.csdn.net/zhouruifu2015/article/details/129965342

https://blog.csdn.net/zhouruifu2015/article/details/129965353

分页

DRF中的分页是指将数据按照一定数量分割成多页的显示方法。每页显示一定的数据量,可以通过用户点击或者其他手段进行翻页操作。DRF分页的作用是在返回数据时,将数据分页显示,避免一次性返回大量数据导致网络传输不稳定、用户体验不佳等问题。

当的数据库数据量非常大时,如果一次将这些数据查询出来, 必然加大了服务器内存的负载,降低了系统的运行速度。一种更好的方式是将数据分段展示给用户。如果用户在展示的分段数据中没有找到自己的内容,可以通过指定页码或翻页的方式查看更多数据,直到找到自己想要的内容为止。

Django REST Framework提供3种分页类:

1. PageNumberPagination

简单分页器。非常常用的一种分页方式,其作用是将数据序列化后,返回符合要求的页码以及页码对应的数据列表。

支持用户按?page=3这种方式查询,可以通过page_size这个参数手动指定每页展示给用户数据的数量。它还支持用户按?page=3&size=10这种更灵活的方式进行查询,这样用户不仅可以选择页码,还可以选择每页展示数据的数量。对于第二种情况,通常还需要设置max_page_size这个参数限制每页展示数据的最大数量,以防止用户进行恶意查询(比如size=10000), 这样一页展示1万条数据将使分页变得没有意义。

2. LimitOffsetPagination

偏移分页器。作用是通过传入的"limit"和"offset"参数实现数据分页,其中"limit"为每页数据数,"offset"是从第几个数据开始返回。

支持用户按?limit=20&offset=100这种方式进行查询。offset是查询数据的起始点,limit是每页展示数据的最大条数,类似于page_size。当使用这个类时,通常还需要设置max_limit这个参数来限制展示给用户数据的最大数量。

3. CursorPagination

加密分页器。按照给定的排序方式将数据分页,每一页的分界点是另一页中最后一个数据的主键值。这种方式可以实现更为灵活的分页,因为它不受 limit 的限制,可以方便的实现“无限滚动式”或“加载更多”式的交互。

这是DRF提供的加密分页查询,仅支持用户按响应提供的上一页和下一页链接进行分页查询,每页的页码都是加密的。使用这种方式进行分页需要的模型有"created"这个字段,否则要手动指定ordering排序才能进行使用。

使用PageNumberPagination

DRF中使用默认分页类的最简单方式就是在settings.py中进行全局配置,如下所示:

展示效果如下,每页展示两条记录, 不支持用户指定每页展示数据的数量。

如何查询一个超出内容数量的页数,则会提示Invalid page

但是如果希望用户按?page=3&size=10这种更灵活的方式进行查询,就要进行个性化定制。在实际开发过程中,定制比使用默认的分页类更常见,具体做法如下。

在app目录下新建pagination.py, 添加如下代码:

#drf_pro/pagination.py

 

 

自定义了一个MyPageNumberPagination类,该类继承了PageNumberPagination类。通过page_size设置了每页默认展示数据的条数,通过page_size_query_param设置了每页size的参数名以及通过max_page_size设置了每页可以展示的最大数据条数。

使用自定义的分页类

在基于类的视图中,可以使用pagination_class这个属性使用自定义的分页类,如下所示:

添加urls

展示效果如下所示:

当然定制分页类不限于指定page_size和max_page_size这些属性,还可以改变响应数据的输出格式。比如这里希望把next和previous放在一个名为links的key里,可以修改MyPageNumberPagination类,重写get_paginated_response方法:

新的展示效果如下所示:

注意:重写get_paginated_response方法非常有用,还可以给分页响应数据传递额外的内容,比如code状态码等等。

前面的例子中只在单个基于类的视图或视图集中使用到了分页类,还可以修改settings.py全局使用自定义的分页类,展示效果是一样的。

REST_FRAMEWORK = {

    'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyPageNumberPagination',

}

使用LimitOffsetPagination

使用这个分页类最简单的方式就是在settings.py中进行全局配置,如下所示:

 

展示效果如下所示,从2页起,每页2条

也可以自定义MyLimitOffsetPagination类,在单个视图或视图集中使用,或者全局使用。

 

展示效果如下,从第2条数据查起,每页展示2条。

使用CursorPagination

全局使用

REST_FRAMEWORK = {

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.CursorPagination',

    'PAGE_SIZE': 2

}

展示效果如下所示:

使用CursorPagination类需要的模型里有created这个字段,否则需要手动指定ordering字段。这是因为CursorPagination类只能对排过序的查询集进行分页展示。Article模型只有create_date字段,没有created这个字段,所以会报错。

为了解决这个问题,需要自定义一个MyCursorPagination类,手动指定按create_date排序, 如下所示:

#drf_pro/pagination.py

修改settings.py, 使用自己定义的分页类。

REST_FRAMEWORK = {

    'DEFAULT_PAGINATION_CLASS': 'blog.pagination.MyArticleCursorPagination',

}

响应效果如下所示,将得到previous和next分页链接。页码都加密了, 链接里不再显示页码号码。默认每页展示3条记录

如果使用?page_size=2进行查询,每页将得到两条记录。

当然由于这个ordering字段与模型相关,并不推荐全局使用自定义的CursorPagination类,更好的方式是在GenericsAPIView或视图集viewsets中通过pagination_class属性指定,如下所示:

函数类视图中使用分页类

注意pagination_class属性仅支持在genericsAPIView和视图集viewset中配置使用。如果使用函数或简单的APIView开发API视图,那么需要对数据进行手动分页,如下示例所示:

代码示例:https://download.csdn.net/download/zhouruifu2015/87657280

输入才有输出,吸收才能吐纳。——码字不易

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】进阶查询-聚合查询和联合查询

文章目录1. 前言2. 表的设计2.1 一对一2.2 一对多2.3 多对多3.将查询结果放到另一个表中4. 聚合查询4.1 聚合函数4.2 GROUP BY4.3 HAVING5. 联合查询(多表查询)5.1 内连接5.2 外连接5.3 自连接5.4 子查询5.5 合并查询6. 总结1. 前言 文章主要围绕着以下三个问题: group by的作…

zookeeper介绍和搭建

zookeeper介绍和搭建一、zookeeper简介二、zookeeper工作机制三、zookeeper集群部署3.1 实验准备3.2 修改配置文件3.3 创建目录以及拷贝文件3.4 配置Zookeeper启动脚本3.5 查看启动状态一、zookeeper简介 1、zookeeper概念 ZooKeeper是一种为分布式应用所设计的高可用、高性能…

尚融宝20-实现用户注册和用户认证

目录 一、需求 二、前端整合发送验证码 三、实现用户注册 1、创建VO对象 2、定义常量 3、引入MD5工具类 4、Controller 5、Service 6、前端整合 四、实现用户登录 1、后端整合JWT 2、前端整合 五、校验用户登录 1、后端 2、前端 一、需求 二、前端整合发送验证码…

数据结构———一万字手撕八大排序算法

常见的排序算法1.排序算法的作用1.1列如我们在购物时1.2玩游戏时英雄战力的排行,都得用到排序算法2.常见排序算法的实现2.1冒泡排序时间复杂度计算:2.2直接插入排序时间复杂度计算:2.3选择排序时间复杂度计算:2.4希尔排序⭐时间复…

Qt音视频开发28-ffmpeg解码本地摄像头(yuv422转yuv420)

一、前言 一开始用ffmpeg做的是视频流的解析,后面增加了本地视频文件的支持,到后面发现ffmpeg也是支持本地摄像头设备的,只要是原则上打通的比如win系统上相机程序、linux上茄子程序可以正常打开就表示打通,整个解码显示过程完全一样,就是打开的时候要传入设备信息,而且…

Prophet学习(五)季节性、假日效应和回归因子

​ 编辑目录 假期和特殊事件建模(Modeling Holidays and Special Events) 内置国家假日(Built-in Country Holidays) 季节性的傅里叶级数(Fourier Order for Seasonalities) 指定自定义季节&#xff08…

启动neo4j备忘录

做个备忘录 Neo4j下载、安装、环境配置 优秀教程:https://blog.csdn.net/zeroheitao/article/details/122925845 Neo4j环境变量配置 1、安装JDK 由于Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。配置…

【数据结构】反射

文章目录🌷 1 定义🌷 2 用途(了解)🌷 3 反射基本信息🌷 4 反射相关的类🌳 4.1 Class类(反射机制的起源)Class类中的相关方法🌳 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用⭐️反射使用1&a…

3个宝藏级软件,每一个都超级好用,少装一个跟你急

分区助手 下载地址:https://www.disktool.cn/ 很多新手小白使用电脑都不懂,把所有软件都安装到了C盘,时间久了储存的东西变多,C盘空间着实不够用,这个免费的工具可以帮你重新分区,无损数据地执行。除了无损…

腾讯云8核16G18M轻量服务器CPU带宽流量性能测评

腾讯云轻量应用服务器8核16G18M带宽,18M公网带宽下载速度峰值可达2304KB/秒,相当于2.25M/s,系统盘为270GB SSD盘,3500GB月流量,折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽月…

ChatGPT资讯—2023.4.3

一、 最新资讯 1. UC伯克利开源大语言模型Vicuna又来了 Vicuna-13b只需要花费300美刀(比Alpaca的600美元便宜一半)就能搞出来接近ChatGPT的水平。如何用小资源大模型让个人普通者与中小微企业也能用上高科技一直是开源社区孜孜追求的目标 Vicuna开源代…

ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系

数字化转型中少不了ERP系统的存在,CRM/MRP/PLM/APS/MES/WMS/SRM这些都需要一起上吗? 如下图所示,是某企业IT系统集成架构流图。 先了解一下ERP是做什么的,ERP就是企业资源管理系统,从企业的价值链分析,企业…

用机器学习sklearn+opencv-python过古诗文网4位数字+字母混合验证码

目录 获取验证码图片 用opencv-python处理图片 制作训练数据集 训练模型 识别验证码 编写古诗文网的登录爬虫代码 总结与提高 源码下载 在本节我们将使用sklearn和opencv-python这两个库过掉古诗文网的4位数字字母混合验证码,验证码风格如下所示。 验证码获…

分库分表介绍以及shardingjdbc实现分库分表

分库分表概念 一、什么是分库分表 分库分表是在海量数据下,由于单库、表数据量过大,导致数据库性能持续下降的问题,演变出的技术方案。 分库分表是由分库和分表这两个独立概念组成的,只不过通常分库与分表的操作会同时进行&…

还不懂怎么设计超时关单?一文告诉你!

背景介绍 ​ 提交订单,是交易领域避不开的一个话题。在提交订单设计时,会涉及到各种资源的预占:如商品库存、优惠券数量等等。但是,下单的流程并不能总是保证成功的,如商品库存异常的时候被拦截、优惠券数量不足的时候…

3月更新 | Visual Studio Code Python

我们很高兴地宣布,2023年3月版 Visual Studio Code Python 和 Jupyter 扩展现已推出! 此版本包括以下改进: 后退按钮和取消功能添加到创建环境命令默认情况下,Python 扩展不再附带 isortJupyter 笔记本中内核选择的改进Python P…

Modbus 协议详解

Modbus 协议详解 通信协议是指双方实体完成通信或服务所必须遵循的规则和约定,例如我们为实现人与人之间的交流需要约定统一的语言,统一的文字,规定语速等等。 而对于设备之间,协议定义了数据单元使用的格式(例如大端…

四、数组、切片,映射

一、一维数组 //声明一个包含5个元素的整型数组 var array [5]int //具体数值填充数组 array : [5]int{1, 2, 3, 4, 5} //容量由初始化值的数量决定 array : [...]int{1, 2, 3, 4, 5) //只初始化索引为1和2的元素 array : [5]int{1: 10, 2: 20} //修改索引为2的元素的值 array…

Linux文件系统、虚拟内存、进程与线程、锁

文章目录文件系统suLinux 中默认没有 super 命令/proc/etc/var/root/home/bin/dev/lib/sbintmp句柄maxfdPWDpathhomeexportwdfdu虚拟内存jobsLinux下一切皆文件swaponmkswap进程与线程nohup子进程与父进程unix进程间的通信方式线程的同步方式sedtarhistory硬链接ln(…

Go分布式爬虫笔记(二十一)

文章目录21 切片和哈希表切片底层结构截取扩容哈希表原理哈希碰撞拉链法开放寻址法(Open Addressing)读取重建原理删除原理思考题Go 的哈希表为什么不是并发安全的?在实践中,怎么才能够并发安全地操作哈希表?拉链法开放…