DRF-分页器-:APIView使用自定义的分页器

一、自定义的分页器:

from  rest_framework.pagination import PageNumberPagination
class APIViewPageNumberPaginations():
    class APIViewBasePaginations(PageNumberPagination):
        page_size = 2  # 每页数据量
        page_query_param = 'page'  # ?page=1跳转页
        max_page_size = 10  # 每页最大数据量
        page_size_query_param = 'size'
    def __init__(self,request,serializer,queryset):
        '''
        :param request: 当前的请求
        :param serializer:  模型类的序列化器
        :param queryset:  要操作的模型对象
        '''
        self.request = request
        self.serializer = serializer
        self.queryset = queryset

    def start(self):
        # 1、实例分页对象
        paginat = self.APIViewBasePaginations()
        # 2、拿到分页后的数据
        page_list = paginat.paginate_queryset(queryset=self.queryset, request=self.request, view=self)
        # 3、对分页后的数据将进行序列化
        ser = self.serializer(instance=page_list, many=True)
        count = paginat.page.paginator.count  # 总数据量
        next_page = 1 if paginat.get_next_link() else 0  # 有下一页,返回1,没有返回0
        previous_page = 1 if paginat.get_previous_link() else 0  # 有上一页时,返回1,没有返回0
        page_size = paginat.page_size  # 每页大小
        pages = count // page_size  # 总页数
        current_page = self.request.query_params.get('page')
        try:
            current_page = int(current_page)
        except Exception as e :
            current_page = 'error'
        if count % page_size:
            pages += 1
        return {
            'data': ser.data, #当前页的数据
            'next': next_page, #是否有下一页
            'previous': previous_page, #是否有上一页
            'count': count, #总数据量
            'pages': pages, #总页数
            'current_page':current_page #当前的页数
        }

二、使用

序列化器

class UserInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserModel
        fields = ['id','username','role','phone','email','email','sex','entry_time','is_enable']

视图:

from utils.pagenations import APIViewPageNumberPaginations
class UserInfoAPIView(APIView):
    permission_classes = [permission.AdminPermission]
    def get(self,request):
        #拿到数据集
        instance = models.UserModel.objects.filter(role__gt=1).order_by('id')
        #拿到序列化器
        ser = serializer.UserInfoModelSerializer
        #实例化化分页对象
        paginat = APIViewPageNumberPaginations(request,ser,instance)
        #拿到分页后的数据
        data = paginat.start()
        return Response(data=data)

路由:

path('user/info',views.UserInfoAPIView.as_view(),name='user-info'),

三、分页拿到的数据

{
    "data": [
        {
            "id": 4,
            "username": "lhf",
            "role": 2,
            "phone": "13610391274",
            "email": null,
            "sex": 1,
            "entry_time": "2023-01-28",
            "is_enable": 1
        },
        {
            "id": 5,
            "username": "zdp",
            "role": 2,
            "phone": "13710391274",
            "email": null,
            "sex": 1,
            "entry_time": "2023-01-28",
            "is_enable": 1
        }
    ],
    "next": 1,
    "previous": 1,
    "count": 5,
    "pages": 3,
    "current_page": "2"
}

猜你喜欢

转载自blog.csdn.net/weixin_46371752/article/details/128841088
今日推荐