django rest framework 自定义分页

上回书说到自定义返回内容,通过继承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,
}

搞定!

发布了66 篇原创文章 · 获赞 21 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_35753140/article/details/90167042