zoukankan      html  css  js  c++  java
  • rest framwork 4 分页功能

    分页功能: 常遇到问题,当数据记录超过1000万条,如何进行分页显示问题,这时就考虑分页功能,

    restframework 分页实现有三种

    第一种:看n页,每页显示n条数据; PageNumberPagination,
    class PagerSerializer(serializers.ModelSerializer):
        class Meta:
            model=models.Role
            fields="__all__"
    class MyPageNumberPagination(PageNumberPagination):
        page_size = 2 #每页显示记录数量
        page_size_query_param = 'size'
        max_page_size = 5 #每页显示最大记录数量
        page_query_param = 'page'
    
    第二种:记录: 在n个位置,向后查看n条数据。LimitOffsetPagination
    class MyLimitOffsetPagination(LimitOffsetPagination):
        default_limit = 3
        limit_query_param = 'limit'
    
        offset_query_param = 'offset'
    
        max_limit = 5
    第三种;加密分页: 上一页和下一页,记录最大值和最小值,CursorPagination
    class MyCursorPagination(CursorPagination):
        cursor_query_param = 'cursor'
    
        page_size = 2
    
        ordering = '-id'
        page_size_query_param = None
        max_page_size = 4
    实战使用
    class PagerView(APIView):
        def get(self,request,*args,**kwargs):
            #1 获取所有数据
    
            roles=models.Role.objects.all()
    
            #2 创建分页对象
            # Pager=PageNumberPagination()
            # Pager=MyLimitOffsetPagination()
            Pager=MyCursorPagination()
            #3在数据库中获取分页的数据
            page_role=Pager.paginate_queryset(queryset=roles,request=request,view=self)
            #4对数据进行序列化
            ser = PagerSerializer(instance=page_role, many=True)
            # return Response(ser.data)
            return Pager.get_paginated_response(ser.data)
    View Code

    分页实战:

    # coding: utf-8
    from rest_framework.pagination import LimitOffsetPagination
    from rest_framework.response import Response
    
    class AuctionLimitPagination(LimitOffsetPagination):
        default_limit = 5 # 默认分页记录
        max_limit=50  # 首次分页记录
        limit_query_param = 'limit'
        offset_query_param = 'offset'
        def get_offset(self, request): #起始位置
            return 0
        def get_paginated_response(self, data): # 返回数据格式
            return Response(data)
    from  rest_framework.filters import   BaseFilterBackend
    
    class ReachBottomFilter(BaseFilterBackend):
    
        def filter_queryset(self, request, queryset, view):
            min_id = request.query_params.get('min_id')
            if not min_id:
                return queryset
            return queryset.filter(id__lt=min_id)
    
    
    class PullDownRefreshFilter(BaseFilterBackend):
    
        def filter_queryset(self, request, queryset, view):
            max_id = request.query_params.get('max_id')
            if not max_id:
                return queryset
            return queryset.filter(id__gt=max_id).reverse()
    
    from rest_framework.viewsets import GenericViewSet
    from rest_framework.mixins import  RetrieveModelMixin,ListModelMixin
    class auctionView(ListAPIView):
    
    
          # 如果是列表必须两个数据,一个是查询数据,一个是序列化
          queryset = models.Auction.objects.filter(status__gt=0).order_by('id')
          serializer_class = auctionSerializers
          filter_backends = [ReachBottomFilter,PullDownRefreshFilter]
          pagination_class = AuctionLimitPagination
    
          # #获取goods另外一种写法
          def get(self,request,*args,**kwargs):
          #     response=super(auctionView,self).get(request,*args,**kwargs)
          #     # 根据response.data获取所有专场id id_list
            #相关的所有商品    models.AuctionItem.objects.filter(auction_id_in=id_list)
                return  response
  • 相关阅读:
    $Noip2018/Luogu5022$ 旅行
    $Noip2018/Luogu5020$ 货币系统 $dp$
    $Noip2018/Luogu5021$ 赛道修建 二分+树形
    $Noip2018/Luogu5019/Luogu1969$ 铺设道路
    $Poj1220/AcWing124 Number Base Convertion$ 进制转换+高精除
    $Poj1050 To the Max$
    $Poj1723/AcWing123 Soldiers$ 排序
    luogu质数距离
    模板线性筛
    CERC2016 bfs 最大生瓶颈边 lca
  • 原文地址:https://www.cnblogs.com/pushuiyu/p/14008731.html
Copyright © 2011-2022 走看看