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程序中自定义异常的方法
Oct 16 Python
python机器学习实战之最近邻kNN分类器
Dec 20 Python
python实现感知器算法(批处理)
Jan 18 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
详解使用django-mama-cas快速搭建CAS服务的实现
Oct 30 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
python 字典套字典或列表的示例
Dec 16 Python
Django之form组件自动校验数据实现
Jan 14 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
python中出现invalid syntax报错的几种原因分析
Feb 12 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 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入门速成教程
2007/03/19 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
WordPress中"无法将上传的文件移动至"错误的解决方法
2015/07/01 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
Yii核心验证器api详解
2016/11/23 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
将angular-ui的分页组件封装成指令的方法详解
2017/05/10 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
Python中的几种矩阵乘法(小结)
2019/07/10 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Python同时处理多个异常的方法
2020/07/28 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
广州盈通面试题
2015/12/05 面试题
机电一体化专业推荐信
2013/12/03 职场文书
迟到检讨书900字
2014/01/14 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
入队仪式主持词
2015/07/04 职场文书