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计算三角函数之acos()方法的使用
May 15 Python
Python合并两个字典的常用方法与效率比较
Jun 17 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python计算两个日期相差天数的方法示例
May 23 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
python爬虫框架scrapy实现模拟登录操作示例
Aug 02 Python
Ubuntu下Python2与Python3的共存问题
Oct 31 Python
Django中使用Celery的方法示例
Nov 29 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
python实现简单银行管理系统
Oct 25 Python
基于python3的socket聊天编程
Feb 17 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 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多维数组去掉重复值示例分享
2014/03/02 PHP
PHP JSON出错:Cannot use object of type stdClass as array解决方法
2014/08/16 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
Javascript模板技术
2007/04/27 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
jquery中的 $("#jb51")与document.getElementById("jb51") 的区别
2011/07/26 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
七个不允许错过的jQuery小技巧
2015/12/21 Javascript
Bootstrap每天必学之折叠(Collapse)插件
2016/04/25 Javascript
js实现百度搜索提示框
2017/02/05 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
python实现文件快照加密保护的方法
2015/06/30 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
超简单使用Python换脸实例
2019/03/27 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
工程专业求职自荐书范文
2014/02/18 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
聚会通知怎么写
2015/04/23 职场文书