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中使用pprint函数进行格式化输出的教程
Apr 07 Python
图文详解WinPE下安装Python
May 17 Python
Python中的os.path路径模块中的操作方法总结
Jul 07 Python
Python实现网站注册验证码生成类
Jun 08 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
浅谈Python反射 & 单例模式
Mar 21 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
Python抓包程序mitmproxy安装和使用过程图解
Mar 02 Python
python实现3D地图可视化
Mar 25 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
python区块链实现简版工作量证明
May 25 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+Ajax实现验证码的实时验证
2016/07/20 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
IE6弹出“已终止操作”的解决办法
2010/11/27 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
2016/08/02 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
JS动态修改网页body的背景色实例代码
2017/10/07 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
angular之ng-template模板加载
2017/11/09 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
urllib2自定义opener详解
2014/02/07 Python
python 实时遍历日志文件
2016/04/12 Python
Python使用wxPython实现计算器
2018/01/30 Python
python奇偶行分开存储实现代码
2018/03/19 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
给老师的道歉信
2014/01/11 职场文书
班级聚会策划书
2014/01/16 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang