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读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
python调用百度语音REST API
Aug 30 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
python区分不同数据类型的方法
Oct 14 Python
Python上下文管理器用法及实例解析
Nov 11 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
Python Matplotlib绘制条形图的全过程
Oct 24 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实现的下载css文件中的图片的代码
2010/02/08 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
javascript中的对象创建 实例附注释
2011/02/08 Javascript
基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解
2013/05/07 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
JavaScript面向对象程序设计创建对象的方法分析
2018/08/13 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[48:30]LGD vs infamous Supermajor小组赛D组 BO3 第一场 6.3
2018/06/04 DOTA
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
python随机数分布random均匀分布实例
2019/11/27 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
Python中Yield的基本用法
2020/10/18 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
工作表现自我评价
2014/02/08 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
学校运动会感想
2015/08/10 职场文书
竞聘书的秘诀
2019/04/02 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
分析SQL窗口函数之取值窗口函数
2022/04/21 Oracle