Я хочу перезаписать Response
класс фреймворка django так, чтобы ответный словарь обратной реакции содержал три параметра message
, status
и data
Здравствуйте, дорогие все
Я пытаюсь изменить Response Class
в DRF
, чтобы передать два дополнительных параметра (сообщение, статус) плюс данные, предоставляемые сериализатором DRF.message
передает сообщение типа Done
, User Created
или т. Д. И status
передает сообщение типа fail
или success
или т. Д., И это сообщение полезно для резервирования специального кода между внешним интерфейсом и внутренним интерфейсом.
Я хочу, чтобы, если не установить этот параметр, вернуть пустой символ или нулевой результат обратно на клиентскую сторону
, например, в режиме успеха:
{
'data': {
'value_one': 'some data',
'value_two': 'some data',
'value_three': [
'value', 'value', 'value'
],
},
}
'message': 'Done',
'status': 'success',
}
и в режиме сбоя:
{
'data': ['any error message raise by serializer',]
'message': 'Create User Failed',
'status': 'failure',
}
Я ищу свой вопрос и нашел решение:
, если я унаследую DRF Response Class
в своем классе и перезаписываю __init__
метод и получаю сообщение, данные и статус в этом методе ивызовите init родительского объекта с собственной структурой данных и используйте этот отзывчивый класс в моей функциональности, например:
from rest_framework.response import Response
class Response(Response):
def __init__(self, data=None, message=None, data_status=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
data_content = {
'status': data_status,
'data': data,
'message': message,
}
super(Response, self).__init__(
data=data_content,
status=status,
template_name=template_name,
headers=headers,
exception=exception,
content_type=content_type
)
в режиме успеха; вызов:
return Response(data=serializer.data, message='Done', data_status='success', status=200)
inвызов режима сбоя:
return Response(data=serializer.errors, message='Create User Failed', data_status='failure', status=400)
и использование собственного класса Response во всех классах представлений, которые мы имели problem
в этом решении: если мы используем GenericViews Class
, необходимо перезаписать все методы http, которые мы использовали в логике представления и вызовесобственный класс, и это DRY !!
и другое решение, которое я нашел.в сериализованном слое мы имеем абстрактный метод def to_representation(self, instance):
в Serializer
классе и реализуем в другом классе, например ModelSerializer
наследование класса Serializer
, и если мы перезаписываем этот метод в нашем сериализаторе и повторно выбираем данные перед отправкой в слой представления,реализовать как:
from collections import OrderedDict
class OurSerializer(serializer.ModelSerializer):
....
def to_representation(self, instance):
data = super(serializers.ModelSerializer, self).to_representation(instance)
result = OrderedDict()
result['data'] = data
result['message'] = 'Done'
result['status'] = 'sucssed'
return result
это решение решает вышеуказанную проблему, но у нас снова есть две проблемы
одна: если мы используем вложенный сериализатор и нам пришлось перезаписать эту функцию в классе сериализатора, вернуть неверные данные, такие как:
{
'data': {
'value_one': 'some data',
'value_two': 'some data',
'value_three': {
'data': [
'value', 'value', 'value'
],
'message': 'Done',
'status': 'sucssed',
},
}
'message': 'Done',
'status': 'sucssed',
}
и message
и status
повторяются и структура не очень привлекательна для клиента
и два: мы не можем обработать исключение в этом режиме и просто способ обработать исключение только с помощью класса промежуточного программного обеспечениякак это Обработка исключений DRF , и это бесполезный способ, мы не можем обрабатывать любые типы ошибок, возникающих в поле зрения, и генерировать удобные отдельные message
и status
.
IFесть еще одно хорошее решение этого вопроса, пожалуйста, наведите меня.
спасибо:)