1、自定义分页器
class APIViewPageNumberPaginations():
from rest_framework.pagination import PageNumberPagination
class APIViewBasePaginations(PageNumberPagination):
page_size = 2
page_query_param = 'page'
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):
paginat = self.APIViewBasePaginations()
page_list = paginat.paginate_queryset(queryset=self.queryset, request=self.request, view=self)
ser = self.serializer(instance=page_list, many=True)
count = paginat.page.paginator.count
next_page = 1 if paginat.get_next_link() else 0
previous_page = 1 if paginat.get_previous_link() else 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
}
2、在视图中使用:
class UserInfoAPIView(APIView):
permission_classes = [permission.AdminPermission]
def get(self, request):
'''
功能:返回用户信息(除了role=1的用户,管理员用户信息不展示)
:return:
'''
name = request.query_params.get('name')
role = request.query_params.get('role')
instance = models.UserModel.objects.filter(role__gt=1).order_by('id')
if name and name!='全部':
instance = instance.filter(name__contains=name)
if role and role!='全部':
instance = instance.filter(role=role)
ser = serializer.UserInfoModelSerializer
paginat = APIViewPageNumberPaginations(request, ser, instance)
data = paginat.start()
return Response(data=data)