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中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
介绍Python的Django框架中的QuerySets
Apr 20 Python
Python对列表排序的方法实例分析
May 16 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
python3实现windows下同名进程监控
Jun 21 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
基于python和flask实现http接口过程解析
Jun 15 Python
python redis存入字典序列化存储教程
Jul 16 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 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的header和asp中的redirect比较
2006/10/09 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
Maps Javascript
2007/01/22 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
Python转换HTML到Text纯文本的方法
2015/01/15 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
在NumPy中创建空数组/矩阵的方法
2018/06/15 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
高级工程师岗位职责
2013/12/15 职场文书
消防先进事迹材料
2014/02/10 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2016暑期师德培训心得体会
2016/01/09 职场文书
Python关于OS文件目录处理的实例分享
2021/05/23 Python
mysql查看表结构的三种方法总结
2022/07/07 MySQL