Entonces, tengo lo siguiente:
class ObjectViewSet( mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet ): """ REST API endpoints for Objects. """ serializer_class = ObjectSerializer queryset = Object.objects.all() Esto devuelve, digamos, para una solicitud GET de lista:
[ { "uuid": "787573a2-b4f1-40df-9e3a-8555fd873461", }, { "uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665", } ]Sin embargo, ¿cómo podría alterar ligeramente esta respuesta para que los mixins sean similares a los siguientes?
{ success: true, message: 'Some Extra Useful Message', data: [ { "uuid": "787573a2-b4f1-40df-9e3a-8555fd873461", }, { "uuid": "2ab56449-1be1-47d7-aceb-a9eaefa49665", } ] } ¿Es esto posible, o debería simplemente escribir mi propia Response() y no utilizar la capacidad de mezclas de mixins ?
Entonces, esencialmente, cambiando la costumbre:
Response(data, status=None, template_name=None, headers=None, content_type=None)Para:
response = { 'success': true, 'message': 'Some Extra Useful Message', 'data': serializer.data } Response(response, status=None, template_name=None, headers=None, content_type=None)Puede manejar este formato de respuesta usando Middelwares . Si, según el código de estado, tiene un formato fijo para una respuesta, escriba un middleware.
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 El middleware está escrito en el módulo CustomMiddleware como middleware.py , luego agregue
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 ] en el archivo settings.py .
Después de una larga investigación, encontré esto útil y más apropiado para usar. Para tales casos de uso, se debe consultar esta documentación . En su caso, puede hacer lo siguiente:
Declarar una clase 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)Actualiza tu configuración.py
REST_FRAMEWORK = { # Other code 'DEFAULT_RENDERER_CLASSES': ( '<app-name>.renderer.JSONResponseRenderer', ) }Actualice su clase ViewSet
class YourViewSet(viewsets.ModelViewSet): # Other code renderer_classes = [JSONResponseRenderer]¡Y ya está todo listo! Consulte también esta publicación más.