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 相关文章推荐
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
简单介绍使用Python解析并修改XML文档的方法
Oct 15 Python
python flask实现分页效果
Jun 27 Python
Django中反向生成models.py的实例讲解
May 30 Python
python opencv读mp4视频的实例
Dec 07 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
python如何实现视频转代码视频
Jun 17 Python
python打开windows应用程序的实例
Jun 28 Python
Win10 安装PyCharm2019.1.1(图文教程)
Sep 29 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
Python执行时间的几种计算方法
Jul 31 Python
有趣的二维码:使用MyQR和qrcode来制作二维码
May 10 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 字符截取 解决中文的截取问题,不用mb系列
2009/09/29 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
php解决约瑟夫环示例
2014/04/09 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
javascript window对象属性整理
2009/10/24 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
详解NODEJS基于FFMPEG视频推流测试
2017/11/17 NodeJs
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Python实现二维数组输出为图片
2018/04/03 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python开发游戏的前期准备
2019/05/05 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
2020/02/07 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
逻辑链路控制协议
2016/10/01 面试题
植物生产学专业求职信
2014/08/08 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
结婚典礼主持词
2015/06/29 职场文书
《蓝鲸的眼睛》读后感5篇
2020/01/15 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python
德生2P3收音机开箱评测
2022/04/30 无线电