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的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
详细解析Python中的变量的数据类型
May 13 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
python实现猜数字小游戏
Mar 24 Python
python 定义给定初值或长度的list方法
Jun 23 Python
Python向excel中写入数据的方法
May 05 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
基于Python函数和变量名解析
Jul 19 Python
Django 创建/删除用户的示例代码
Jul 24 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
python实现随机加减法生成器
Feb 24 Python
Python爬虫之Selenium鼠标事件的实现
Dec 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
php微信公众号开发之秒杀
2018/10/20 PHP
JQuery 入门实例1
2009/06/25 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
python dataframe NaN处理方式
2019/12/26 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
日语专业推荐信
2013/11/12 职场文书
应届大学生求职的自我评价
2013/11/17 职场文书
课程设计的心得体会
2014/09/03 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
优秀员工自荐书
2015/03/06 职场文书
安全主题班会教案
2015/08/12 职场文书