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 相关文章推荐
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
Django如何配置mysql数据库
May 04 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
Jan 07 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
使用python实现mqtt的发布和订阅
May 05 Python
详解Python传入参数的几种方法
May 16 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
python 如何设置守护进程
Oct 29 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
Python Process创建进程的2种方法详解
Jan 25 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多层数组与对象的转换实例代码
2013/08/05 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
PHP中的类型约束介绍
2015/05/11 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
JavaScript手风琴页面制作
2017/05/17 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
vue实现在v-html的html字符串中绑定事件
2019/10/28 Javascript
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
英语专业应届生求职信范文
2013/11/15 职场文书
公司市场部岗位职责
2013/12/02 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
文案策划专业自荐信
2014/07/07 职场文书
人与自然观后感
2015/06/16 职场文书
2015年高三教学工作总结
2015/07/21 职场文书
小学生教师节广播稿
2015/08/19 职场文书
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技