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多重继承实例
Oct 11 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
Jan 17 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
简单了解python中对象的取反运算符
Jul 01 Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 Python
python config文件的读写操作示例
Sep 27 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
Python对excel的基本操作方法
Feb 18 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 session机制
2011/07/17 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
var与Javascript变量隐式声明
2009/09/17 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python学习笔记:字典的使用示例详解
2014/06/13 Python
用Python编写一个国际象棋AI程序
2014/11/28 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
Python人工智能之路 jieba gensim 最好别分家之最简单的相似度实现
2019/08/13 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
应届生人事助理求职信
2013/11/09 职场文书
电脑教师的自我评价
2013/12/18 职场文书
妇联主席先进事迹
2014/05/18 职场文书
村党支部书记承诺书
2014/05/29 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
领导干部群众路线教育实践活动剖析材料
2014/10/10 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书