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编程时利用wxPython来支持多线程的方法
Apr 07 Python
详解Django中的form库的使用
Jul 18 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
python 判断网络连通的实现方法
Apr 22 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
5分钟 Pipenv 上手指南
Dec 20 Python
python学生管理系统学习笔记
Mar 19 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
Python Map 函数的使用
Aug 28 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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中PDO解决中文乱码问题的一些补充
2010/09/06 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
基于jQuery Tipso插件实现消息提示框特效
2016/03/16 Javascript
jQuery实现页面倒计时并刷新效果
2017/03/13 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
JavaScript无操作后屏保功能的实现方法
2017/07/04 Javascript
js 提取某()特殊字符串长度的实例
2017/12/06 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python添加菜单图文讲解
2019/06/04 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
python字符串的index和find的区别详解
2020/06/20 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
2014国庆节商场促销活动策划方案
2014/09/16 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
整改报告怎么写
2014/11/06 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
2015年暑期见闻
2015/07/14 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏