Django REST framework 分页的实现代码


Posted in Python onJune 19, 2019

官方文档[这里]

用于分页的模块: Pagination

Django REST framework 有内置 Pagination 模块,无需额外安装, 只需做简单的配置.

配置什么呢? 就是告诉Django要用到什么样的分页样式, 比如: 返回哪些字段, 每页的大小, 请求参数的名称等等.

2种配置途径:

1.settings.py 文件里做全局的配置
2.单独为每个需要分页的 view 分配自定义分页器.

途径1是为所有继承ListViewAPI的接口做默认配置, 途径2对单独一个接口做个性化配置.

需要注意的是: 途径1做了全局的配置, 所有继承 ListAPIView 的接口,默认都会有分页. 这会影响到现有接口返回数据的结构. 除了这一点, 途径1还是相当不错的.

我比较喜欢仅使用途径2, 我可以自定义了一个通用型的分页器, 只为有需要分页的view分配分页器, 也是挺方便的.

途径1: settings.py文件里做全局配置

REST_FRAMEWORK = {
 # ...
  'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
  'PAGE_SIZE': 100
}

DEFAULT_PAGINATION_CLASS: 默认分页器(BasePagination的子类). Django提供了3个类型: PageNumberPagination、LimitOffsetPagination、CursorPagination. 不同类型返回的分页信息不同. 也可以是你自定义的分页器.

PAGE_SIZE: 分页大小.

途径2: 自定义分页器

这里将示例使用自定义分页器的流程.

新建一个 paginations.py 用于写分页器:

我们在 paginations.py 文件里写一个通用的分页器:

class StandarPagination(PageNumberPagination):
  page_size = 20 # 默认每页显示条数配置
  page_query_param = 'page' # “页数”的请求参数名称, 默认是page
  page_size_query_param = 'page_size' # “分页大小”的请求参数名称
 
  # 进入父类 PageNumberPagination 可看响应体返回字段.
  #  def get_paginated_response(self, data):
  #  return Response(OrderedDict([
  #    ('count', self.page.paginator.count),
  #    ('next', self.get_next_link()),
  #    ('previous', self.get_previous_link()),
  #    ('results', data)
  #  ]))

  
  # 觉得不适用, 那就拷贝出来,重载函数, 自己多加几个字段. 
  # (可通过官方文档或直接调试得知从哪些属性获取正确的值.)
  def get_paginated_response(self, data):
    return Response(OrderedDict([
      ('count', self.page.paginator.count),
      ('next', self.get_next_link()),
      ('previous', self.get_previous_link()),
      ('page', self.page.number),
      ('total_page', self.page.paginator.num_pages),
      ('page_size', self.page.paginator.per_page),
      ('results', data)
    ]))

(更多的属性介绍请查看文档)

为接口分配分页器, 为属性 pagination_class 赋值即可.

from rest_framework.pagination import PageNumberPagination

class MyListAPI(ListAPIView):
  queryset = TestModel.objects.filter()
  serializer_class = TestModelSerializer
  pagination_class = StandarPagination # 新增

完成!

假如该接口请求地址是 http://api/test/

看客户端是如何请求接口的:

http://api/test/ : 返回第一页, 分页大小是20.

http://api/test/?page=2&page_size=10: 返回第二页,分页大小是10.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
python dict乱码如何解决
Jun 07 Python
Python 在函数上添加包装器
Jul 28 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python获取磁盘号下盘符步骤详解
Jun 19 #Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 #Python
PyQt5 多窗口连接实例
Jun 19 #Python
django框架实现一次性上传多个文件功能示例【批量上传】
Jun 19 #Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
Jun 19 #Python
django框架基于模板 生成 excel(xls) 文件操作示例
Jun 19 #Python
python 读写excel文件操作示例【附源码下载】
Jun 19 #Python
You might like
在PHP中利用XML技术构造远程服务(下)
2006/10/09 PHP
PHP调用三种数据库的方法(2)
2006/10/09 PHP
php桌面中心(二) 数据库写入
2007/03/11 PHP
php图片上传类 附调用方法
2016/05/15 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
js获取系统的根路径实现介绍
2013/09/08 Javascript
浅析Node.js中的内存泄漏问题
2015/06/23 Javascript
必备的JS调试技巧汇总
2016/07/20 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
Python变量和字符串详解
2017/04/29 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
利用python实现PSO算法优化二元函数
2019/11/13 Python
python实现井字棋小游戏
2020/03/04 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
2020/03/11 Python
python实现拼接图片
2020/03/23 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
优秀少先队工作者事迹材料
2014/05/13 职场文书
食品安全承诺书范文
2014/08/29 职场文书
民事辩护词范文
2015/05/21 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Golang中channel的原理解读(推荐)
2021/10/16 Golang
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python
python小型的音频操作库mp3Play
2022/04/24 Python