DRF之分页器

发布时间 2023-04-18 14:55:26作者: 阿勒泰的鱼

DRF提供了3个分页器,apiView和GenericView的用法是不一样的,具体使用方式如下,

1.PageNumberPagination

基于GenericAPIView实现的排序

class BOOKS2(GenericAPIView,ListModelMixin):

    queryset = models.Books.objects.all()
    serializer_class = SERList.BookModelSerializer
    pagination_class = PageNumList1

    def get(self,request,*args,**kwargs):
        self.queryset=self.queryset.filter(id__gt=2)
        res=self.list(request, *args, **kwargs)
        # return Response(res)
        return res

定义分页器PageNumList1

class PageNumList1(PageNumberPagination):
    page_size = 2
    # 单页数量
    page_query_param='nb'
    #  翻页代码
    page_size_query_param='max'
    #  可以定制单页数量
    #  http://127.0.0.1:8000/books/?nb=3&max=5
    max_page_size = 4

基于APIView实现的分页

class BookApiView(APIView):

    def get(self, request, *args, **kwargs):

        query_list = models.Books.objects.all()
        page = PageNumList1()
        # 在数据库中获取分页的数据
        page_list = page.paginate_queryset(query_list, request, view=self)
        # 对分页进行序列化
        ser = SERList.BookModelSerializer(instance=page_list, many=True)
        return Response(ser.data)

路由 

url=http://127.0.0.1:8000/pager/?page=2&size=3

2.LimitOffsetPagination 偏移分页

视图类  基于APIView   Geniric 直接配
class
BookApiView(APIView): # 获取所有 def get(self, request, *args, **kwargs): # print(kwargs) query_list = models.Books.objects.all() # ser_list = SERList.BookModelSerializer(query_list, many=True) page = PageNumList2() # 在数据库中获取分页的数据 page_list = page.paginate_queryset(query_list, request, view=self) # 对分页进行序列化 ser = SERList.BookModelSerializer(instance=page_list, many=True) return Response(ser.data)

分页器
class PageNumList2(LimitOffsetPagination):

max_limit = 2
default_limit = 3
limit_query_param = 'limit'
offset_query_param = 'off'
路由
http://127.0.0.1:8000/books/?offset=4&limit=3

3. CursorPagination偏移分页

分页器
class PageNumList3(CursorPagination):
    cursor_query_param = 'tip'
    page_size = 2
    ordering = '-id'

视图函数
class BookApiView(APIView):

    def get(self, request, *args, **kwargs):

        query_list = models.Books.objects.all()
        page = PageNumList3()
        # 在数据库中获取分页的数据
        page_list = page.paginate_queryset(query_list, request, view=self)
        # 对分页进行序列化
        print(page.get_next_link())
        print(page.decode_cursor(request))
        ser = SERList.BookModelSerializer(instance=page_list, many=True)
        return Response(ser.data)

要想提供分页的上下url 还得像apiview一样,自己实例化类。