Django REST framework: как обернуть ответ дополнительными полями .... и предоставить текущий ответ в поле данных - PullRequest
3 голосов
/ 13 февраля 2020

Итак, у меня есть следующее:

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",
    }
]

Однако, как я могу немного изменить этот ответ чтобы миксины были похожи на следующее:

{
    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)

1 Ответ

2 голосов
/ 13 февраля 2020

Вы можете обработать этот формат ответа, используя Middelwares. Если на основе кода состояния у вас установлен фиксированный формат ответа, напишите промежуточное программное обеспечение.

class ResponseFormatMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        try:
            if (not getattr(response, 'error', False)) and (isinstance(response.data, dict) or isinstance(response.data, list)):
                response.data = {'success': True, 'message':'some message','data': response.data}
        except AttributeError:
            pass
        return response

Промежуточное программное обеспечение записывается в модуле CustomMiddleware как middleware.py, затем добавьте

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'CustomMiddleware.middleware.ResponseFormatMiddleware', # Added this line
]

в settings.py файле.

...