前言

当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面

  • PageNumberPagination:基础分页器,性能略差
  • LimitOffsetPagination:偏移分页器
  • CursorPagination:游标分页器,性能强大

PageNumberPagination

基础分页器PageNumberPagination,数据量越大性能越差。

首先我们在app中创建一个pagination.py文件,然后自定义一个分页器类,继承自PageNumberPagination

from rest_framework.pagination import PageNumberPagination

class MyPageNumberPagination(PageNumberPagination):
"""
普通分页,数据量越大性能越差
"""
# 默认页面展示的条数
page_size = 3
# 前端访问url需要添加 ?page=页码
page_query_param = 'page'
# 用户自定义返回的条数,格式?page_size=页数
page_size_query_param = "page_size"
# 用户自定义返回的条数最大限制,数值超过5也只展示5条
max_page_size = 5

如果我们需要局部配置则在类视图中访问使用pagination_class = MyPageNumberPagination即可

如果是全局配置,则在settings.py文件中配置如下:

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'api.pagination.MyPageNumberPagination',
}

之后我们访问url只需在后面加入?page=页码数即可

比如http://127.0.0.1:8000/api/cars/?page=2,代表访问第二页的数据,数据的条数默认为page_size的值

比如http://127.0.0.1:8000/api/cars/?page=2&page_size=5,代表访问第二页的数据,用户自定义返回的条数为5条

LimitOffsetPagination

首先我们自定义一个分页器类,继承自LimitOffsetPagination

class MyLimitOffsetPagination(LimitOffsetPagination):
# url后面跟limit请求参数,
limit_query_param = 'limit'
# url后面跟offset请求参数
offset_query_param = 'offset'
# 最大限制20条
max_limit = 20
# 默认限制3条
default_limit = 3

之后我们访问url只需要在后面加入?limit=10即可

比如http://127.0.0.1/api/cars/?limit=10代表访问的数据最多展示10条,如果你limit的值>max_limit,那么还是按照max_limit的值来展示数据的条数

比如http://127.0.0.1/api/cars/?offset=1,这里没有limit参数,所以默认展示3条,offset=1代表从数据库列表中提取数据的时候,是从下标1开始提取,比如提取的数据列表是['test1', 'test2', 'test3', 'test4'],本来我们默认提取前3条,但是你加上offset=1后,他是从列表下标为1开始提取,所以最后提取的数据是test2test3test4

CursorPagination

游标分页器跟基础分页器用法差不多,只是游标分页的针对下一页数据的url进行了加密

首先我们自定义一个分页器类,继承自CursorPagination

class MyCursorPagination(CursorPagination):
"""
Cursor 光标分页 性能高,安全
"""
page_size = 10
page_size_query_param = "page_size"
max_page_size = 20
ordering = '-price'

如果我们视图中使用了排序过滤filter_backends = [OrderingFilter],那么我们在访问url的时候必须携带参数?ordering=需要排序的字段

最新文章

  1. CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(2)CSS3利用图层叠加实现多背景
  2. 控件 UI: VisualState, VisualStateManager, 控件的默认 UI
  3. IO多路复用及ThreadingTCPServer源码阅读
  4. Android Launcher分析和修改9——Launcher启动APP流程
  5. CRM 2016 自动保存 Save event arguments
  6. 用委托在listbox中异步显示信息,解决线程间操作无效,从不是创建控件的线程访问它
  7. MySql级联操作
  8. chroot命令
  9. jQuery 评分插件(转)
  10. Windows PE入门基础知识:Windows PE的作用、命名规则、启动方式、启动原理
  11. 关于NOR_FLASH的大小在单片机程序中的应用
  12. Java URLClassLoader 和 ClassLoader类加载器
  13. lnmp 基础设置
  14. 解决java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor问题
  15. GPUImage中饱和度调整的实现——GPUImageSaturationFilter
  16. Qt error ------ qRegisterMetaType() 跨线程信号与槽的形参携带
  17. caffe 中base_lr、weight_decay、lr_mult、decay_mult代表什么意思?
  18. 6. 纯 CSS 绘制一颗闪闪发光的璀璨钻石
  19. 哈希连接(hash join) 原理
  20. 如何在Oracle官网下载java的JDK最新版本和历史版本

热门文章

  1. Excel-宏与VBA-数据类型
  2. Visual Lab Online —— 事后分析
  3. [MySQL数据库之表的详细操作:存储引擎、表介绍、表字段之数据类型]
  4. mouseenter mouseleave鼠标悬浮离开事件
  5. 排坑·IPhone&IOS中不兼容正则中的断言匹配
  6. Linux(深度)系统安装富士施乐(网络)打印机
  7. CentOS 8 配置 VNC Server
  8. Vim删除空行
  9. mpstat命令
  10. Windows10查看电脑的USB接口是2.0还是3.0