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中的Numpy矩阵操作
Aug 12 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
python使用百度文字识别功能方法详解
Jul 23 Python
Python编写带选项的命令行程序方法
Aug 13 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
Python基于requests实现模拟上传文件
Apr 21 Python
Keras loss函数剖析
Jul 06 Python
python不同版本的_new_不同点总结
Dec 09 Python
图文详解matlab原始处理图像几何变换
Jul 09 Python
Python进程池与进程锁之语法学习
Apr 11 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生成静态HTML速度快类库
2007/03/18 PHP
PHP Document 代码注释规范
2009/04/13 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
php通过ksort()函数给关联数组按照键排序的方法
2015/03/18 PHP
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
JavaScript 中的 this 工作原理
2018/06/20 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
2020/11/06 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
公司年会演讲稿范文
2014/01/11 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
119消防日活动总结
2014/08/29 职场文书
2015年试用期工作总结
2014/12/12 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2016年乡镇综治宣传月活动总结
2016/03/16 职场文书
创业计划书介绍
2019/04/24 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python