上回书说到自定义返回内容,通过继承viewsets.ModelViewSet
实现,这里面有个问题,在list函数,也就是返回结果列表这个功能里,如果用到了分页,就需要额外的调整来实现自定义返回内容了。
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
###########
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
###########
serializer = self.get_serializer(queryset, many=True)
return Response({'code': 1, 'msg': '成功', 'data': serializer.data})
井号区域内就是分页走的分支,显然不会走到自定义的返回那里。django rest framework模块化程度很高,分页的问题就在分页解决,下面是自定义分页的解决方案。
在应用的文件夹下新建一个core文件夹里面新建一个pagination.py
:
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
class CustomPagination(PageNumberPagination):
def get_paginated_response(self, data):
return Response({
'code': 1,
'msg': '成功',
'data': {
'current_page': self.page.number,
'count': self.page.paginator.count,
'results': data
}
})
在项目的settings里添加rest framework的配置:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'myapp.core.pagination.CustomPagination',
'PAGE_SIZE': 10,
}
搞定!