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
  • 相关阅读:
    LDAP服务器的概念和原理简单介绍
    LDAP概念和原理介绍
    @ENABLEWEBSECURITY和@ENABLEWEBMVCSECURITY有什么区别?
    解决:javac: 无效的目标发行版: 1.8
    win10下,cmd,power shell设置默认编码为‘UTF-8’?
    windows 控制台cmd乱码(及永久修改编码)的解决办法
    学而不思则罔,思而不学则殆(读书要思考,灵活运用。考虑问题的时候,不要陷入空想,要去看书学一下才有用)(孔子亲测:吾尝终日不食,终夜不寝,以思,无益,不如学也),死记硬背不行,光自己琢磨不看书也不行
    【需求采集】用户访谈的注意点
    C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)
    arm cpu的架构及分类说明
  • 原文地址:https://www.cnblogs.com/pushuiyu/p/14008731.html
Copyright © 2011-2022 走看看