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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
python列表操作实例
Jan 14 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
详解Python3中yield生成器的用法
Aug 20 Python
浅谈Python基础之I/O模型
May 11 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
python数据化运营的重要意义
Nov 25 Python
python实现最速下降法
Mar 24 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
详细介绍python类及类的用法
May 31 Python
Python实现学生管理系统(面向对象版)
Jun 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 简单日历实现代码
2009/10/28 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
利用JQuery和Servlet实现跨域提交请求示例分享
2014/02/12 Javascript
js面向对象的写法
2016/02/19 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
layui table 参数设置方法
2018/08/14 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
vue+element实现表单校验功能
2019/05/20 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
Python利用BeautifulSoup解析Html的方法示例
2017/07/30 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Python 类属性与实例属性,类对象与实例对象用法分析
2019/09/20 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
2020/01/08 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
彻底解决Python包下载慢问题
2020/11/15 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
中专毕业生自我鉴定
2014/02/02 职场文书
森林病虫害防治方案
2014/06/02 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
医学会议开幕词
2016/03/03 职场文书