分页功能: 常遇到问题,当数据记录超过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)
分页实战:
# 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