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爬虫
Dec 25 Python
python处理按钮消息的实例详解
Jul 11 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
Sep 26 Python
Flask框架Flask-Login用法分析
Jul 23 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
Apr 29 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
Python OpenCV视频截取并保存实现代码
Nov 30 Python
python加载自定义词典实例
Dec 06 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 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
新浪新闻小偷
2006/10/09 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
php实现Mysql简易操作类
2015/10/11 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
快速使用Bootstrap搭建传送带
2016/05/06 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
bootstrap下拉菜单使用方法解析
2017/01/13 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
微信小程序实现收藏与取消收藏切换图片功能
2018/08/03 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
Python创建数字列表的示例
2019/11/28 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
党员个人对照检查材料思想汇报
2014/09/16 职场文书
老人节标语大全
2014/10/08 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书