drf分页组件(5星)
目录
分页Pagination(5星)
当我们的数据比较多的时候,就需要用到分页,一般在查询所有的接口中,才有分页功能,很常用,就是网站的下一页功能,app的下滑加载更多。
REST framework提供了分页的支持。配置分页类,继承GenericAPIView及子类,才能使用
PageNumberPagination 基本分页
**用的最多 **
重要类属性
page_size = api_settings.PAGE_SIZE # 每页显示条数
page_query_param = 'page' # 查询使用的参数http:.../?page=2 改的是page
page_size_query_param = 'size' # http:.../?page=1&size=4 size是更改一次返回的条数
max_page_size = 10 # 一页最多显示10条(优先级最高)
使用方法
新建一个py文件
from rest_framework.pagination import PageNumberPagination
class CommonPagination(PageNumberPagination): # 继承上面的类然后重写参数
page_size = 3 # 每页显示条数
page_query_param = 'page' # 查询使用的参数http:.../?page=2 改的是page
page_size_query_param = 'site' # http:.../?page=1&size=4 size是更改一次展示的条数(类似limit)
max_page_size = 5 # 每页最多显示多少条,?page=3&size=9,最终还是显示5条
# 当在url里输入page=last时,就会跳到最后一页
在视图类里:
from app01.pagination import CommonPagination # 把分页类导入
class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
pagination_class = CommonPagination # 使用分页类
#####配置分页类,继承GenericAPIView及子类,才能使用#####
分页与过滤连用
from rest_framework.filters import SearchFilter, OrderingFilter
from .untils import BookFilter, MyPageNumber
class BookAPIView(GenericViewSet, ListModelMixin):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
filter_backends = [SearchFilter, OrderingFilter]
search_fields = ['title', 'price']
ordering_fields = ['price', 'id']
pagination_class = MyPageNumber
LimitOffsetPagination 偏移分页
重要类属性
default_limit = api_settings.PAGE_SIZE # 显示多少条
limit_query_param = 'limit' # 查询使用的参数http:.../limit=2&offset=4 改的是limit
offset_query_param = 'offset' # offset偏移的查询参数 改的是offset,比如改成'o'
max_limit = 5 # 最大显示条数,为5
使用方法
新建一个py文件
from rest_framework.pagination import LimitOffsetPagination
class CommonLimitOffset(LimitOffsetPagination):
default_limit = 3 # 显示多少条
limit_query_param = 'limit' # 查询使用的参数http:.../limit=2&offset=4 改的是limit
offset_query_param = 'offset' # offset偏移的查询参数 改的是offset,比如改成'o'
max_limit = 5 # 最大显示条数,为5
在视图类里:
from app01.pagination import CommonLimitOffset # 把分页类导入
class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
pagination_class = CommonLimitOffset # 使用分页类
#####配置分页类,继承GenericAPIView及子类,才能使用#####
CursorPagination游标分页
只用后不能用其他的排序 不然报错
重要类属性
ordering = 'id' # 排序,按id排序 一定要有排序
cursor_query_param = 'cursor' # 查询参数 改的是cursor,比如改成'c'
page_size = 3 # 每页显示多少条
page_size_query_param = 'size' # 通过这个参数决定每页显示多少条
max_page_size = 5 # 每页最大显示多少条
使用方法
新建一个py文件
from rest_framework.pagination import CursorPagination
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询条件
page_size = 3 # 每页显示多少条
ordering = 'id' # 排序,按id排序
page_size_query_param = 'size' # 通过这个参数决定每页显示多少条
max_page_size = 5 # 每页最大显示多少条
在视图类里:
from app01.pagination import CommonCursorPagination
class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer
pagination_class = CommonCursorPagination
#####配置分页类,继承GenericAPIView及子类,才能使用#####
总结
# Cursor分页和上面两种的区别:上面两种,可以从中间位置获取某一页,Cursor的方式只能上一页和下一页
# PageNumber和LimitOffset这两种在获取某一页的时候,都需要从开始过滤到要取的页面数的数据
# 而Cursor分页是先排序,内部维护了一个游标,游标只能选择往前或往后走,在取某一页的时候,不许哟啊过滤之前的数据
Cursor分页:
## 优点:速度最快,数据量越大,越有优势(抖音下划分页,不需要指定跳转到第几页)
## 缺点:只能前一页和后一页,不能直接跳到某一页
继承APIView实现分页
以PageNumberPagination 基本分页为例(剩下两种都是一样的操作)
使用方法
在新的py文件内书写分页类
from rest_framework.pagination import PageNumberPagination
class CommonPagination(PageNumberPagination):
page_size = 3 # 每页显示条数
page_query_param = 'page' # 查询时用的参数http:.../?page=2 改的是page
page_size_query_param = 'site' # http:.../?page=1&size=4 size是更改一次返回的条数
max_page_size = 10 # 一页最多显示10条(优先级最高)
在视图类里:
class BookViewALL(APIView):
throttle_classes = []
authentication_classes = []
permission_classes = []
def get(self,request,*args,**kwargs):
book_list=Books.objects.all()
#实例化得到一个对象
pagination=CommonPageNumberPagination()
#调用对象方法,传入要分页的数据,book_list,返回分页号的数据
new_book_list=pagination.paginate_queryset(book_list,request,self)
# 序列化分页后的数据
ser=BookSerializer(instance=new_book_list,many=True)
# 返回方式
return pagination.get_paginated_response(ser.data)