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

 

posted @ 2020-11-19 23:55  dayu2020  阅读(120)  评论(0)    收藏  举报