To resolve this, best practice (that DRF has proposed) is to use ‘renderer’
classes. A renderer manipulates and returns structured response.
Django uses renderers like Template Renderer and DRF
benefits this feature and provides API Renderers.
To do so, you could provide such this renderer in a package (e.g.
app_name.renderers.ApiRenderer):
from rest_framework.renderers import baseRendererfrom rest_framework.utils import jsonclass 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)And then in your settings file:
REST_frameWORK = { ... 'DEFAULT_RENDERER_CLASSES': ( 'app_name.renderers.ApiRenderer', ), ...}By this action all views that extend DRF generic views will use renderer. If
you needed to override setting you can use
renderer_classesattribute for
generic view classes and
@renderer_classesdecorator for api view functions.
A comprehensive renderer class to override is available at
<virtualenv_dir>/lib/python3.6/site-packages/rest_framework/renderers.py.



