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学习RabbitMQ消息队列
Nov 30 Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 Python
Python实现的递归神经网络简单示例
Aug 11 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
详解Django+Uwsgi+Nginx的生产环境部署
Jun 25 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
如何通过Django使用本地css/js文件
Jan 20 Python
Python如何爬取qq音乐歌词到本地
Jun 01 Python
python绘制趋势图的示例
Sep 17 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 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+DBM的同学录程序(1)
2006/10/09 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
完善CodeIgniter在IDE中代码提示功能的方法
2014/07/19 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
jQuery实现推拉门效果
2020/10/19 jQuery
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Numpy数组转置的两种实现方法
2018/04/17 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
Python Series从0开始索引的方法
2018/11/06 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
安全资料员岗位职责
2013/12/14 职场文书
给民警的表扬信
2014/01/08 职场文书
项目经理任命书内容
2014/06/06 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS