在 django rest 框架的自定义分页中更改渲染器 class

Change renderer class inside custom pagination in django rest framework

我在 settings.py 中默认使用自定义渲染器 class。对于 api,我检查查询参数“page”,如果它存在,那么我使用来自 settings.py 的默认渲染器 class 对结果进行分页,否则 return 正常响应。但是我有问题,我只想使用 JSONResponse 渲染器进行分页

settings.py

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'app.core.renderers.CustomJSONRenderer',
        "rest_framework.renderers.JSONRenderer",
        "rest_framework.renderers.BrowsableAPIRenderer",
    ),
}

renderers.py

class CustomJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        status_code = renderer_context['response'].status_code
        response = {
            "success": True,
            "message": None,
            "data": data,
        }

        return super(CustomJSONRenderer, self).render(response, accepted_media_type, renderer_context)

views.py

class User_View(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = User_Serializer

    pagination_class = CustomPagination
    ### If page param exist then use pagination class else not use

pagination.py

class CustomPagination(PageNumberPagination):
    page_size_query_param = 'size'
    page_size = int(settings.PAGE_SIZE)

    def get_paginated_response(self, data):
        return Response({
            'success': True,
            'total': self.page.paginator.count,
            'page_size': self.get_page_size(self.request),
            'current_page': self.page.number,
            'last_page': self.page.paginator.num_pages,
            'data': data,
        })

错误回复:

{
    "success": true,
    "message": null,
    "data": {
        "success": true,
        "total": 6,
        "page_size": 15,
        "current_page": 1,
        "last_page": 1,
        "data": [
            {
                "id": 1,
                "username": "admin",
                "permissions": []
            }
        ]
    }
}

正确答案(预期):

{
        "success": true,
        "total": 6,
        "page_size": 15,
        "current_page": 1,
        "last_page": 1,
        "data": [
            {
                "id": 1,
                "username": "admin",
                "permissions": []
            }
        ]
}

我该如何解决?

我通过更新 CustomJSONRenderer 解决了问题 class

class CustomJSONRenderer(JSONRenderer):
    def render(self, data, accepted_media_type=None, renderer_context=None):
        status_code = renderer_context['response'].status_code
        request = renderer_context.pop('request')
        page = request.query_params.get('page', None)

        # Check page query params
        if page is not None:
            response = data
        else:
            response = {
                'success': True,
                'message': None,
                'data': data,
            }

        return super(CustomJSONRenderer, self).render(response, accepted_media_type, renderer_context)