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内置的字符串处理函数详细整理(覆盖日常所用)
Aug 19 Python
使用Python实现博客上进行自动翻页
Aug 23 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
python实现图片彩色转化为素描
Jan 15 Python
Python常见数字运算操作实例小结
Mar 22 Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
Python SQLAlchemy入门教程(基本用法)
Nov 11 Python
Python实现密钥密码(加解密)实例详解
Apr 26 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
一文读懂python Scrapy爬虫框架
Feb 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 similar_text 字符串的相似性比较函数
2010/05/26 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
php使用QueryList轻松采集js动态渲染页面方法
2018/09/11 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
js实现动态添加上传文件页面
2018/10/22 Javascript
vue实现二级导航栏效果
2019/10/19 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
python中学习K-Means和图片压缩
2017/11/20 Python
点球小游戏python脚本
2018/05/22 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
2019/06/05 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
英国网上花店:Bunches
2016/11/29 全球购物
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
Java面试题汇总
2015/12/06 面试题
客运企业隐患排查工作方案
2014/06/06 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
党校学习党性分析材料
2014/12/19 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
MySQL系列之十一 日志记录
2021/07/02 MySQL