rest framwork 4 分页功能

2023-07-31,,

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

rest framwork 4 分页功能的相关教程结束。

《rest framwork 4 分页功能.doc》

下载本文的Word格式文档,以方便收藏与打印。