DRF框架中分页功能接口
DRF框架中分页功能接口
一、在框架中提供来三个类来实现分页功能,PageNumberPagination、LimitOffsetPagination、CursorPagination
- PageNumberPagination是页码分页,这个类可以进行全局设置
- LimitOffsetPagination按照偏移量来进行分页
- 两个类都可以实现,在程序的具体设计上会有一部分的差别,但是差别不大。
- CursorPagination加密分页功能
二、使用PageNumberPagination类进行分页功能设计
Note
分页组件的基本逻辑:如果需要实现分页功能,首先需要从数据库中获得到所有的数据,正常情况下是获取到数据之后直接实例化序列化类,返回数据给前端。如果用到分页组件,必须在从数据库中获得到数据后,实例化序列化类之前对数据进行分页处理,再把处理后的数据作为instance的值进行传递。
方式一:通过直接使用PageNumberPagination类来实现
from rest_framework.pagination import PageNumberPagination
class Page1View(APIView):
user_obj = UserInfo.objects.all()
# 获取所有的数据
pg = PageNumberPagination()
# 实例化分页类
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
# 调用paginate_queryset方法对数据进行分页处理,参数有三个:
#1. queryset是我们从数据库中取出的所有数据
2.request=request
3.view是处理分页的视图,本视图用self
serializer = Page1Serializer(instance=page, many=True)
return Response(serializer.data)
# 实例化序列化类,并返回处理后的数据
方式二:自定义分页类
#自定义分页类,实现分页功能
from rest_framework.pagination import PageNumberPagination
# 创建分页类
class MyPagination(PageNumberPagination):
page_size = 1
# 每页显示数据的数量
max_page_size = 4
# 每页最多可以显示的数据数量
page_query_param = 'page'
# 获取页码时用的参数
page_size_query_param = 'size'
# 调整每页显示数量的参数名 class Page2View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
# 自定义的分页类中实例化后使用get_paginated_response方法可以实现显示上下页链接的功能
return data
Note
自定义的分页类继承PageNumberPagination类,在继承类的基础上添加设置,通过自定义类来处理原始的数据。page_size、max_page_size、page_size_query_param这三个是绑定在一起的,主要就是解决每一个中显示数据的数量,page_query_param主要解决的是获取页码的参数名,get_paginated_response实现的是添加上下页链接的功能,如果只想要数据,上下页链接的功能可以去掉,这样也会减少流量的消耗。
三、使用LimitOffsetPagination实现分页功能
这个类是实现分页功能基本和上一个类一致,不同的是get搜索时的参数名不同,这个类是根据当前的位置offset(默认为0,可以设置)和偏移量limit(即每页显示的数量)来进行查询的
方式一:直接使用LimitOffsetPagination来实现
from rest_framework.pagination import LimitOffsetPagination class Page3View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = LimitOffsetPagination()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
return Response(serializer.data)
Note
查询时的url:http://127.0.0.1:8000/api/users/V1/page3view/?limit=1&offset=2
自定义分页类实现分页功能
# 自定义分页类来实现分页功能
class MyPagination1(LimitOffsetPagination):
default_limit = 1
# 默认的每页查询的数据数量(偏移量)
max_limit = 3
# 每一页最大的数据数量
offset_query_param = 'offset'
# 开始进行分页的起始位置,默认为0
limit_query_param = 'limit'
# 查询数据时使用的参数 class Page4View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination1()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
return data
四、继承CursorPagination类自定义分页类实现分页功能
Note
CursorPagination也可以被成为加密分页,会对页码进行加密处理,访问者无法通过修改页码来进行访问,这中方式相对于PageNumberPagination分页的优点是避免因用户任意修改页码,从而数据库查询数量过大,造成数据库过载和查询速度慢的问题,这个也是数据库查询性能优化,例如PageNumberPagination中用户可以直接将页码改为1000,而CursorPagination中只能查看上下页
from rest_framework.pagination import CursorPagination
class MyPagination2(CursorPagination):
page_size = 1
max_page_size = None
ordering = 'id'
# 按照id升序进行查询显示
page_size_query_param = None
cursor_query_param = 'cursor'
class Page5View(APIView):
def get(self, request, *args, **kwargs):
user_obj = UserInfo.objects.all()
pg = MyPagination2()
page = pg.paginate_queryset(queryset=user_obj, request=request, view=self)
serializer = Page1Serializer(instance=page, many=True)
data = pg.get_paginated_response(serializer.data)
return data
DRF框架中分页功能接口的更多相关文章
- drf框架中分页组件
drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...
- drf框架中所有视图及用法
0909自我总结 drf框架中所有视图及用法 一.drf框架中的所有视图类 from django.views import View from rest_framework import views ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- django drf框架中的user验证以及JWT拓展的介绍
登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...
- drf框架中jwt认证,以及自定义jwt认证
0909自我总结 drf框架中jwt 一.模块的安装 官方:http://getblimp.github.io/django-rest-framework-jwt/ 他是个第三方的开源项目 安装:pi ...
- drf框架中认证与权限工作原理及设置
0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...
- DRF框架中链表数据通过ModelSerializer深度查询方法汇总
DRF框架中链表数据通过ModelSerializer深度查询方法汇总 一.准备测试和理解准备 创建类 class Test1(models.Model): id = models.IntegerFi ...
- DRF框架中的异常处理程序
目录 DRF框架中自定义异常处理 一.自定义异常的原因 二.如何设置处理异常的程序 DRF框架中自定义异常处理 一.自定义异常的原因 在Django和DRF框架中都封装了很多的处理异常的程序,可以处理 ...
- java ssm框架实现分页功能 (oracle)
java web 实现分页功能 使用框架:ssm 数据库:oracle 话说 oracle 的分页查询比 mysql 复杂多了,在这里简单谈一下: 查询 前十条数据: SELECT * FROM( S ...
随机推荐
- Kafka数据迁移MaxCompute最佳实践
摘要: 本文向您详细介绍如何使用DataWorks数据同步功能,将Kafka集群上的数据迁移到阿里云MaxCompute大数据计算服务. 前提条件 搭建Kafka集群 进行数据迁移前,您需要保证自己的 ...
- adblock自定义规则
click.admaster.cn/* cm.baidu.com/* cm.pos.baidu.com/* cpro.baidu.com/* cpro.baidustatic.com/* dup.ba ...
- PHP内置服务器
PHP在安装的时候会内置了服务器的功能,我们在使用的过程中如果只是调试,可以选择启动PHP内置的服务器,下面是windows下PHP内置服务器的启动步骤: 1.将php的D:\phpStudy\php ...
- img的alt和title的异同?
alt 是图片加载失败时,显示在网页上的替代文字: title 是鼠标放上面时显示的文字,title是对图片的描述与进一步说明; 这些都是表面上的区别,alt是img必要的属性,而title不是. 对 ...
- Group_concat介绍与例子
进公司做的第一个项目就是做一个订单追踪查询,里里外外连接了十一个表,作为公司菜鸡的我麻了爪. 其中有一个需求就是对于多行的数据在一行显示,原谅我才疏学浅 无奈下找到了项目组长 在那学来了这个利器 ( ...
- Python--day62--Django安装,配置,web请求流程,views.py总结
1,安装Django 2,创建Django项目: 3,配置Django项目 1.settinngs.py文件 1.templates文件夹的位置 2.静态文件 1,STATIC_URL ----- ...
- 使用vuex来管理数据
最近一直工作比较忙,博客已经鸽了好久了,趁着今天是周末,写点东西吧 使用vuex来管理数据 最近一直在用vue做项目,但是却从来没真正去用过vuex,因为一直感觉很复杂,其实真正去研究一下啊,就会发现 ...
- H3C IPv6地址解析
- P1025 最大完美度
题目描述 定义一个字符串的完美度为字符串中所有字符的完美度的和. 现在给你一个只含字母的字符串s, 每一个字母的完美度由你进行分配, 可以分配给一个字母[1,26]中的一个数字作为完美度, 但每个字母 ...
- jquery 选择多级父子元素
<div class="box"> <div class="item"> <div class="out"&g ...