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调用Delphi写的Dll代码示例
Dec 05 Python
python 构造三维全零数组的方法
Nov 12 Python
Python 从subprocess运行的子进程中实时获取输出的例子
Aug 14 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
Oct 30 Python
Pandas操作CSV文件的读写实现方法
Nov 13 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
Dec 05 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
python实现IOU计算案例
Apr 12 Python
Django models文件模型变更错误解决
May 11 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
Python文件操作及内置函数flush原理解析
Oct 13 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
php 分页类 扩展代码
2009/06/11 PHP
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
php新建文件自动编号的思路与实现
2011/06/27 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
PHP实现下载功能的代码
2012/09/29 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
php遍历数组的4种方法总结
2014/07/05 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
JS event使用方法详解
2008/04/28 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
微信小程序上传图片功能(附后端代码)
2020/06/19 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
python Django连接MySQL数据库做增删改查
2013/11/07 Python
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
python模拟事件触发机制详解
2018/01/19 Python
Python装饰器语法糖
2019/01/02 Python
python实现五子棋小程序
2019/06/18 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
表决心的诗句大全
2014/03/11 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
MybatisPlus代码生成器的使用方法详解
2021/06/13 Java/Android
vue.js 使用原生js实现轮播图
2022/04/26 Vue.js