Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

416
Vistas
Django REST framework: cómo envolver la respuesta con campos adicionales ... y proporcionar la respuesta actual en el campo de datos

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)
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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 .

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda