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 socket网络编程TCP/IP服务器与客户端通信
Jan 05 Python
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
python正则表达式爬取猫眼电影top100
Feb 24 Python
如何实现删除numpy.array中的行或列
May 08 Python
Python装饰器用法实例总结
May 26 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 Python
python实现翻译word表格小程序
Feb 27 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
PyTorch device与cuda.device用法
Apr 03 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和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
PHP 身份证号验证函数
2009/05/07 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
JavaScript EasyPager 分页函数
2011/05/25 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
JS中微信小程序自定义底部弹出框
2016/12/22 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
微信小程序点餐系统开发常见问题汇总
2019/08/06 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
Python中atexit模块的基本使用示例
2015/07/08 Python
Python 多线程Threading初学教程
2017/08/22 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python实现按长宽比缩放图片
2018/06/07 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
Jupyter notebook运行Spark+Scala教程
2020/04/10 Python
材料采购员岗位职责
2013/12/17 职场文书
捐书寄语赠言
2014/01/18 职场文书
大学毕业感言100字
2014/02/03 职场文书
中专自我鉴定
2014/02/05 职场文书
电台实习生求职信
2014/02/25 职场文书
电气工程自动化求职信
2014/03/14 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
市场营销工作计划书
2014/05/06 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL
mysql查询结果实现多列拼接查询
2022/04/03 MySQL