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基础教程之python消息摘要算法使用示例
Feb 10 Python
python实现简单温度转换的方法
Mar 13 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
使用Python对SQLite数据库操作
Apr 06 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
关于Python-faker的函数效果一览
Nov 28 Python
基于Python中random.sample()的替代方案
May 23 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 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应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
js实现小时钟效果
2020/03/25 Javascript
Python入门篇之字符串
2014/10/17 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
Python实现LRU算法的2种方法
2015/06/24 Python
Python实现针对中文排序的方法
2017/05/09 Python
Python元组知识点总结
2019/02/18 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python flask几分钟实现web服务的例子
2019/07/26 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
微信浏览器取消缓存的方法
2015/03/28 HTML / CSS
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
员工培训心得体会
2013/12/30 职场文书
中学家长会邀请函
2014/02/03 职场文书
幼儿园招生广告
2014/03/19 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年电厂工作总结
2014/12/04 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
乱世佳人观后感
2015/06/08 职场文书
浅析JavaScript中的变量提升
2022/06/01 Javascript