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计算三维矢量幅度的方法
Jun 15 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
python3中的md5加密实例
May 29 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
详解Python logging调用Logger.info方法的处理过程
Feb 12 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
利用Python多线程实现图片下载器
Mar 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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
JQuery中attr属性和jQuery.data()学习笔记【必看】
2016/05/18 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
JS实现复选框的全选和批量删除功能
2017/04/05 Javascript
jQuery+PHP+Mysql实现抽奖程序
2020/04/12 jQuery
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
T3官网:头发造型工具
2019/12/26 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
实习老师离校感言
2014/02/03 职场文书
中式婚礼主持词
2014/03/13 职场文书
投资建议书模板
2014/05/12 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
vue的项目如何打包上线
2022/04/13 Vue.js