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使用matplotlib绘制柱状图教程
Feb 08 Python
Django学习笔记之Class-Based-View
Feb 15 Python
浅谈numpy数组中冒号和负号的含义
Apr 18 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
解决pip install xxx报错SyntaxError: invalid syntax的问题
Nov 30 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
Feb 06 Python
Python 远程开关机的方法
Nov 18 Python
python IP地址转整数
Nov 20 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 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 加密解密内部算法
2010/04/22 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
twig里使用js变量的方法
2016/02/05 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
PHP+JS实现的实时搜索提示功能
2018/03/13 PHP
ExtJS4中的requires使用方法示例介绍
2013/12/03 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
ReactNative实现Toast的示例
2017/12/31 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
解析Python编程中的包结构
2015/10/25 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
Django Rest framework认证组件详细用法
2019/07/25 Python
Django框架配置mysql数据库实现过程
2020/04/22 Python
python的json包位置及用法总结
2020/06/21 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
纯css3实现照片墙效果
2014/12/26 HTML / CSS
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
对照检查剖析材料
2014/09/30 职场文书
关于环保的广播稿
2015/12/17 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python