• rest-framework之分页器


    一 简单分页(查看第n页,每页显示n条)

    复制代码
    from rest_framework.pagination import PageNumberPagination
    # 一 基本使用:url=url=http://127.0.0.1:8000/pager/?page=2&size=3,size无效
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据,如果出现无序对象列表警告UnorderedObjectListWarning,
         #可以使用models.Girl.objects.get_queryset().order_by("id")
    ret=models.Book.objects.all() # 创建分页对象 page=PageNumberPagination() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) return Response(ser.data) # 二 自定制 url=http://127.0.0.1:8000/pager/?page=2&size=3 # size=30,无效,最多5条 class Mypage(PageNumberPagination): page_size = 2 page_query_param = 'page' # 定制传参 page_size_query_param = 'size' # 最大一页的数据 max_page_size = 5 class Pager(APIView): def get(self,request,*args,**kwargs): # 获取所有数据 ret=models.Book.objects.all() # 创建分页对象 page=Mypage() # 在数据库中获取分页的数据 page_list=page.paginate_queryset(ret,request,view=self) # 对分页进行序列化 ser=BookSerializer1(instance=page_list,many=True) # return Response(ser.data) # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可) return page.get_paginated_response(ser.data)

    复制代码

    setting里

    REST_FRAMEWORK = {
        # 每页显示两条
        'PAGE_SIZE':2
    }

     路由:

    url(r'^pager/$', views.Pager.as_view()),

     Serializers

    class BookSerializer1(serializers.ModelSerializer):
        class Meta:
            model=models.Book
            # fields="__all__"
            exclude=('authors',)

    二 偏移分页(在第n个位置,向后查看n条数据)

    复制代码
    # http://127.0.0.1:8000/pager/?offset=4&limit=3
    from rest_framework.pagination import LimitOffsetPagination
    # 也可以自定制,同简单分页
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            ret=models.Book.objects.all()
            # 创建分页对象
            page=LimitOffsetPagination()
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(ret,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            # return page.get_paginated_response(ser.data)
            return Response(ser.data)
    复制代码

    三 CursorPagination(加密分页,只能看上一页和下一页,速度快)

    思考:不重写类,修改类属性?

    复制代码
    from rest_framework.pagination import CursorPagination
    # 看源码,是通过sql查询,大于id和小于id
    class  Pager(APIView):
        def get(self,request,*args,**kwargs):
            # 获取所有数据
            ret=models.Book.objects.all()
            # 创建分页对象
            page=CursorPagination()
            page.ordering='nid'
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(ret,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            # 可以避免页码被猜到
            return page.get_paginated_response(ser.data)
    复制代码
  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/longfeiwang/p/10898274.html
Copyright © 2020-2023  润新知