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中的字符串知识点
Apr 14 Python
使用Python编写类UNIX系统的命令行工具的教程
Apr 15 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
浅谈Python traceback的优雅处理
Aug 31 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
Dec 19 Python
Python爬虫实现验证码登录代码实例
May 10 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
python创建学生管理系统
Nov 22 Python
django 前端页面如何实现显示前N条数据
Mar 16 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 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
Dedecms常用函数解析
2008/02/01 PHP
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
解析coreseek for sphinx的使用
2013/06/21 PHP
各种快递查询--Api接口
2016/04/26 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
2016/10/20 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
javascript常用函数(2)
2015/11/05 Javascript
js实现自定义路由
2017/02/04 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
基于Vant UI框架实现时间段选择器
2020/12/24 Javascript
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
Python如何实现爬取B站视频
2020/05/20 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
我爱我的祖国演讲稿
2014/05/04 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
青年教师个人总结
2015/02/11 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python