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画一颗心的方法示例
Jan 31 Python
使用Python写一个小游戏
Apr 02 Python
python代码过长的换行方法
Jul 19 Python
python处理multipart/form-data的请求方法
Dec 26 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
Feb 15 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 Python
python中使用np.delete()的实例方法
Feb 01 Python
python基础之错误和异常处理
Oct 24 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/02/16 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
初识Laravel
2014/10/30 PHP
php实现可逆加密的方法
2015/08/11 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
2016/03/17 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
重定向实现代码
2006/11/20 Javascript
javascript 函数式编程
2007/08/16 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
详解vue使用插槽分发内容slot的用法
2019/03/28 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python数组条件过滤filter函数使用示例
2014/07/22 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
代码分析Python地图坐标转换
2018/02/08 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
医院办公室主任职责
2013/12/29 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
2014年团工作总结
2014/11/27 职场文书
Python Pandas读取Excel日期数据的异常处理方法
2022/02/28 Python