Django rest framework分页接口实现原理解析


Posted in Python onAugust 21, 2020

如果没有设置分页,django-rest-framework 会将所有资源类表序列化后返回,如果资源很多,就会对网站性能造成影响。为此,我们来给博客文章列表 API 添加分页功能。

django-rest-framework 为分页功能提供了多个辅助类,常用的有:

PageNumberPagination

将资源分为第 1 页、第 2 页...第 n 页,使用页码号请求分页结果。

LimitOffsetPagination

通过 limit 和 offset 两个参数来控制请求的资源。例如通过发送 API 请求:/posts/?offset=20&limit=5,将获取文章资源列表第 20 篇后的 5 篇文章。如果 offset 以等差数列递增,limit 保持不变,则等价于按页码分页。但 offset 和 limit 可以为任意值,因此这种分页比 PageNumberPagination 更加灵活。

要使用分页功能非常简单,只需在项目的配置文件中配置好分页选项,即可全局启用分页功能。打开 config/common.py 配置文件,写入如下的分页配置:

REST_FRAMEWORK = {
  # 设置 DEFAULT_PAGINATION_CLASS 后,将全局启用分页,所有 List 接口的返回结果都会被分页。
  # 如果想单独控制每个接口的分页情况,可不设置这个选项,而是在视图函数中进行配置
  "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
  # 这个选项控制分页后每页的资源个数
  "PAGE_SIZE": 10,
}

配置完成之后,所有通用视图函数或者视图集生成的资源列表 API,返回的资源列表都会被分页。配置文件中的分页设置将作用于全局,如果某个视图函数或者视图集不想使用全局配置怎么办呢?可以在视图函数或者视图集中设置 pagination_class 属性,指定需要使用的分页辅助类即可。例如将博客文章列表分页替换为 limit offset 的分页方式,可以这样设置:

from rest_framewrok.pagination import PageNumberPagination
class PostViewSet(viewsets.GenericViewSet):
  pagination_class = LimitOffsetPagination

这样,PostViewSet 视图集将返回 limit offset 分页形式的文章列表,而其他视图或者视图集仍将使用全局的分页配置。

请求文章 api,返回结果如下:

Django rest framework分页接口实现原理解析

对返回结果的解释:

count:总资源数目

next:下一页资源的链接

previous:上一页资源的链接

results:当前页的资源列表

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现矩阵乘法的方法
Jun 28 Python
python实现备份目录的方法
Aug 03 Python
利用nohup来开启python文件的方法
Jan 14 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
Django文件存储 默认存储系统解析
Aug 02 Python
python3 反射的四种基本方法解析
Aug 26 Python
如何使用pandas读取txt文件中指定的列(有无标题)
Mar 05 Python
Python脚本实现监听服务器的思路代码详解
May 28 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
python switch 实现多分支选择功能
Dec 21 Python
详解Python自动化之文件自动化处理
Jun 21 Python
Python -m参数原理及使用方法解析
Aug 21 #Python
python使用布隆过滤器的实现示例
Aug 20 #Python
QT5 Designer 打不开的问题及解决方法
Aug 20 #Python
Python配置pip国内镜像源的实现
Aug 20 #Python
Python使用lambda抛出异常实现方法解析
Aug 20 #Python
浅谈对python中if、elif、else的误解
Aug 20 #Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 #Python
You might like
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP常用操作类之通信数据封装类的实现
2017/07/16 PHP
Array对象方法参考
2006/10/03 Javascript
不错的asp中显示新闻的功能
2006/10/13 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
2015/02/27 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
详解基于mpvue微信小程序下载远程图片到本地解决思路
2019/05/16 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
Django实现快速分页的方法实例
2017/10/22 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
物流管理毕业生自荐信
2013/10/24 职场文书
《藏戏》教学反思
2014/02/11 职场文书
请假条的格式
2014/04/11 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
汽车转让协议书范本
2014/12/07 职场文书
人事局接收函
2015/01/31 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
教你利用python实现企业微信发送消息
2021/05/23 Python
Python selenium模拟网页点击爬虫交管12123违章数据
2021/05/26 Python
Win11开始菜单添加休眠选项
2022/04/19 数码科技