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中使用百度音乐搜索的api下载指定歌曲的lrc歌词
Jul 18 Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
python 内置函数filter
Jun 01 Python
对python3 urllib包与http包的使用详解
May 10 Python
TensorFlow打印tensor值的实现方法
Jul 27 Python
python中eval与int的区别浅析
Aug 11 Python
Django错误:TypeError at / 'bool' object is not callable解决
Aug 16 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
python numpy 矩阵堆叠实例
Jan 17 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
Python中的全局变量如何理解
Jun 04 Python
Python如何实现线程间通信
Jul 30 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异常处理方法实例汇总
2015/06/24 PHP
php获取图片信息的方法详解
2015/12/10 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
2016/11/28 PHP
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
JavaScript基础篇(3)之Object、Function等引用类型
2015/11/30 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
使用Vue构建可重用的分页组件
2018/03/26 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vue router返回到指定的路由的场景分析
2020/11/10 Javascript
跟老齐学Python之折腾一下目录
2014/10/24 Python
Python测试人员需要掌握的知识
2018/02/08 Python
Python Cookie 读取和保存方法
2018/12/28 Python
详解Python匿名函数(lambda函数)
2019/04/19 Python
python3 使用traceback定位异常实例
2020/03/09 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
如何利用find命令查找文件
2016/11/18 面试题
平面设计师工作职责范文
2013/12/03 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
大学生表扬信范文
2014/01/09 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
工程质量承诺书
2014/03/27 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
学校创先争优活动总结
2014/08/28 职场文书
机关党员四风问题个人整改措施
2014/10/26 职场文书
mysql查询的控制语句图文详解
2021/04/11 MySQL