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实现正则检测密码合法性
Jan 05 Python
分享python数据统计的一些小技巧
Jul 21 Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
python读取几个G的csv文件方法
Jan 07 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
Python如何在bool函数中取值
Sep 21 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
详解在OpenCV中如何使用图像像素
Mar 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
利用cookie记住背景颜色示例代码
2013/11/04 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
jQuery遍历DOM的父级元素、子级元素和同级元素的方法总结
2016/07/07 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
React 项目迁移 Webpack Babel7的实现
2018/09/12 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
Python 获取div标签中的文字实例
2018/12/20 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
苹果台湾官网:Apple台湾
2019/01/05 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
全球采购的街头服饰和帽子:Urban Excess
2020/10/28 全球购物
员工评语大全
2014/01/19 职场文书
村官工作鉴定评语
2014/01/27 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
车队安全员岗位职责
2015/02/15 职场文书
农村党员干部承诺书
2015/05/04 职场文书
乡镇保密工作承诺书
2015/05/04 职场文书
员工加薪申请报告
2015/05/15 职场文书
祝寿主持词
2015/07/02 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers