封装分页

1在路由改变modelviewset

path('worklist/',views.WorkerView.as_view()),

2在视图里面继承ModelViewset

class WorkerView(APIView):
from rest_framework.views import APIView
from utils.api_Paginators import *
    queryset = WorkOrder.objects.all()
    serializer_class = WorkOrderSerializers

    def get(self,request,objs):
        self.queryset=self.queryset.all()  #获取数据
        ret=Paginators(self.queryset,request,self.serializer_class)
        return Response(ret.data)

3在项目文件夹中找到utils 创建一个.py的文件(名字一定要见名知意)

# -*- coding: utf-8 -*-

from rest_framework.pagination import PageNumberPagination
from django.conf import settings
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
from rest_framework.views import Response


class PageNum(PageNumberPagination):
    page_size_query_param = 'page_size'

def Paginators(objs,request,Serializer):
    '''
    objs :实体对象 ,queryset
    request :请求对象
    Serializer :对应实体对象的类
    page_size :每页显示多少条数据
    page : 显示第几页数据
    total_count :总共有多少条数据
    total :总页数
    '''
    try:
        page_size=int(request.GET.get('page_size',settings.REST_FRAMEWORK['PAGE_SIZE']))
        page=int(request.GET.get('page',1))
    except (TypeError,ValueError):
        return Response(status=400)  #如果发生报错直接终止

    paginator=Paginator(objs,page_size)   #paginator对象
    total_count=paginator.count
    total=paginator.num_pages   #总页数
    try:
        objs=paginator.page(page)
    except PageNotAnInteger:
        objs=paginator.page(1)  #当前页
    except EmptyPage:
        objs=paginator.page(paginator.num_pages)
    serializer=Serializer(objs,many=True)   #序列化
    return Response(              #把data返回过去
        data={
            'results':serializer.data,
            'page':page,
            'page_size':page_size,
            'total':total,
            'count':total_count
        }
    )
posted @ 2020-12-03 18:53  小王小王ii  阅读(85)  评论(0编辑  收藏  举报