DRF框架中分页功能接口
大道至诚 人气:0目录
- 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
加载全部内容