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读写excel的方法
Nov 18 Python
python实现将元祖转换成数组的方法
May 04 Python
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
Oct 18 Python
Python数组定义方法
Apr 13 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
python绘制简单彩虹图
Nov 19 Python
Python变量访问权限控制详解
Jun 29 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
Python实现天气查询软件
Jun 07 Python
Python爬虫 简单介绍一下Xpath及使用
Apr 26 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
再次研究下cache_lite
2007/02/14 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
PHP获取当前系统时间的方法小结
2018/10/03 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
JavaScript打字小游戏代码
2011/12/26 Javascript
浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总
2013/07/08 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
2017/08/07 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
2017/08/23 Javascript
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
Python中防止sql注入的方法详解
2017/02/25 Python
python获取文件真实链接的方法,针对于302返回码
2018/05/14 Python
Python中xml和json格式相互转换操作示例
2018/12/05 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
荷兰度假屋租赁网站:Aan Zee
2020/02/28 全球购物
客户代表实习人员自我鉴定
2013/09/27 职场文书
自动化专业本科毕业生求职信
2013/10/20 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
教务处教学工作总结
2015/08/10 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
Springboot中如何自动转JSON输出
2022/06/16 Java/Android