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及子类,才能使用#####

image

分页与过滤连用

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

image

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及子类,才能使用#####

image

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及子类,才能使用#####

image

总结

# 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)

image

posted @ 2022-04-12 16:25  zong涵  阅读(53)  评论(0编辑  收藏  举报