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 域名分析工具实现代码
Jul 15 Python
分享python数据统计的一些小技巧
Jul 21 Python
Python网络爬虫出现乱码问题的解决方法
Jan 05 Python
python 全文检索引擎详解
Apr 25 Python
python实现BackPropagation算法
Dec 14 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
pandas实现选取特定索引的行
Apr 20 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 Python
tensorflow 实现打印pb模型的所有节点
Jan 23 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
简单了解Python字典copy与赋值的区别
Sep 16 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 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之变量、常量学习笔记
2008/03/27 PHP
php仿discuz分页效果代码
2008/10/02 PHP
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
vue写一个组件
2018/04/09 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
python统计文本文件内单词数量的方法
2015/05/30 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python assert关键字原理及实例解析
2019/12/13 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
2020/10/15 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
护理学毕业生求职信
2013/11/14 职场文书
个人安全承诺书
2014/05/22 职场文书
倡导文明标语
2014/06/16 职场文书
放飞理想演讲稿
2014/09/09 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
推广普通话主题班会
2015/08/17 职场文书
如何写好闭幕词
2019/04/02 职场文书
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
使用python创建股票的时间序列可视化分析
2022/03/03 Python