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开发环境搭建
Dec 16 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
python 实现将多条曲线画在一幅图上的方法
Jul 07 Python
python tkinter组件摆放方式详解
Sep 16 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
python2 对excel表格操作完整示例
Feb 23 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Python 实现自动登录+点击+滑动验证功能
Jun 10 Python
使用tensorflow根据输入更改tensor shape
Jun 23 Python
详解Python requests模块
Jun 21 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+DBM的同学录程序(3)
2006/10/09 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
js操作select控件的几种方法
2010/06/02 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
vue.js的提示组件
2017/03/02 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
django输出html内容的实例
2018/05/27 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
python烟花效果的代码实例
2020/02/25 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
Python3 类型标注支持操作
2021/06/02 Python
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电
Golang连接并操作MySQL
2022/04/14 MySQL