首页 > 解决方案 > Django REST框架:如何用额外的字段包装响应......并在数据字段中提供当前响应

问题描述

所以,我有以下内容:

class ObjectViewSet(
    mixins.CreateModelMixin,
    mixins.ListModelMixin,
    mixins.RetrieveModelMixin,
    mixins.DestroyModelMixin,
    viewsets.GenericViewSet
):
    """
    REST API endpoints for Objects.
    """
    serializer_class = ObjectSerializer
    queryset = Object.objects.all()

例如,对于列表GET请求,这将返回:

[
    {
        "uuid": "787573a2-b4f1-40df-9e3a-8555fd873461",
    },
    {
        "uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665",
    }
]

但是,我怎样才能稍微改变这个 mixins 的响应,使其类似于以下内容:

{
    success: true,
    message: 'Some Extra Useful Message',
    data: [
        {
             "uuid": "787573a2-b4f1-40df-9e3a-8555fd873461",
        },
        {
             "uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665",
        }
    ]
}

这可能吗,还是我应该只编写自己的自定义端点Response()而不利用 DRF 的mixins功能?

所以,本质上,切换自定义:

Response(data, status=None, template_name=None, headers=None, content_type=None)

至:


response = {
    'success': true,
    'message': 'Some Extra Useful Message',
    'data': serializer.data
}

Response(response, status=None, template_name=None, headers=None, content_type=None)

标签: djangodjango-rest-framework

解决方案


经过长时间的研究,我发现这很有用并且最适合使用。对于此类用例,必须参考此文档。在您的情况下,您可以执行以下操作 -

声明一个类renderer.py

from rest_framework.renderers import JSONRenderer
from rest_framework.utils import json


class JSONResponseRenderer(JSONRenderer):
    # media_type = 'text/plain'
    # media_type = 'application/json'
    charset = 'utf-8'

    def render(self, data, accepted_media_type=None, renderer_context=None):
        response_dict = {
            'status': 'failure',
            'data': data,
            'message': '',
        }
        data = response_dict
        return json.dumps(data)

更新你的settings.py

REST_FRAMEWORK = {
    # Other code
    'DEFAULT_RENDERER_CLASSES': (
        '<app-name>.renderer.JSONResponseRenderer',
    )
}

更新您的 ViewSet 类

class YourViewSet(viewsets.ModelViewSet):
    # Other code
    renderer_classes = [JSONResponseRenderer]

你都准备好了!另请参阅此帖子更多。


推荐阅读