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实现根据月份和日期得到星座的方法
Mar 27 Python
Python中使用partial改变方法默认参数实例
Apr 28 Python
python中的代码编码格式转换问题
Jun 10 Python
python从入门到精通(DAY 3)
Dec 20 Python
Python正则简单实例分析
Mar 21 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
Python实现的归并排序算法示例
Nov 21 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
python距离测量的方法
Mar 06 Python
Python管理Windows服务小脚本
Mar 12 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
php调用shell的方法
2014/11/05 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
2014/11/06 PHP
PHP中STDCLASS用法实例分析
2016/11/11 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
jQuery使用一个按钮控制图片的伸缩实现思路
2013/04/19 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
理解JS绑定事件
2016/01/19 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
[04:56]经典回顾:前Ehome 与 前LGD
2015/02/26 DOTA
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
金属材料工程个人求职的自我评价
2013/12/04 职场文书
学习标兵获奖感言
2014/02/20 职场文书
世界读书日的活动方案
2014/08/20 职场文书
病人慰问信范文
2015/02/15 职场文书
教师党员自我评价范文
2015/03/04 职场文书
《给予树》教学反思
2016/03/03 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android