Ya no tienes que buscar más en otras webs ya que llegaste al espacio exacto, poseemos la solución que buscas y sin problema.
Solución:
Para resolver esto, la mejor práctica (que DRF ha propuesto) es usar clases de ‘renderizador’. Un renderizador manipula y devuelve una respuesta estructurada.
Django usa renderizadores como Template Renderer y DRF se beneficia de esta característica y proporciona API Renderers.
Para hacerlo, puede proporcionar este renderizador en un paquete (por ejemplo, app_name.renderers.ApiRenderer
):
from rest_framework.renderers import BaseRenderer
from rest_framework.utils import json
class ApiRenderer(BaseRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
response_dict =
'status': 'failure',
'data': ,
'message': '',
if data.get('data'):
response_dict['data'] = data.get('data')
if data.get('status'):
response_dict['status'] = data.get('status')
if data.get('message'):
response_dict['message'] = data.get('message')
data = response_dict
return json.dumps(data)
Y luego en su archivo de configuración:
REST_FRAMEWORK =
...
'DEFAULT_RENDERER_CLASSES': (
'app_name.renderers.ApiRenderer',
),
...
Mediante esta acción, todas las vistas que amplían las vistas genéricas de DRF utilizarán el renderizador. Si necesita anular la configuración, puede usar renderer_classes
attribute para clases de vista genéricas y @renderer_classes
decorador para funciones de vista api.
Una clase de renderizador integral para anular está disponible en
.
solo una adición: Prefiero heredar de JSONRenderer
. De esa manera, obtendrá el buen formato y la sangría listos para usar.
from rest_framework.renderers import JSONRenderer
class CustomRenderer(JSONRenderer):
def render(self, data, accepted_media_type=None, renderer_context=None):
response =
'error': False,
'message': 'Success',
'data': data
return super(CustomRenderer, self).render(response, accepted_media_type, renderer_context)
Luego en tus puntos de vista:
from rest_framework.renderers import BrowsableAPIRenderer
from api.renderers import CustomRenderer
class MyViewSet(viewsets.ModelViewSet):
renderer_classes = [CustomRenderer, BrowsableAPIRenderer]
...
Cuando se usa con el BrowsableAPIRenderer
como se muestra arriba, obtiene su respuesta personalizada con un formato agradable en la API navegable de DRF
Al final de la página puedes encontrar las aclaraciones de otros usuarios, tú de igual forma puedes mostrar el tuyo si lo deseas.