In my project I use DRF as backend and Angular as frontend.
Django==1.10 djangorestframework==3.7.1
I need all responses from DRF to be in the following format.
{
"status": "", // 200,400,.....etc
"error": "", // True, False
"data": [], // data
"message": "" // Success messages
}
Currently it is in
[
{
"id": 1,
"name": ""
},
{
"id": 2,
"name": ""
}
]
it should be
{
"status": "200",
"error": "False",
"data": [
{
"id": 1,
"name": ""
},
{
"id": 2,
"name": ""
}
],
"message": "Success"
}
for this i have written a custom viewset and overridden the functions list, detail, create, update
class ResponseModelViewSet(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
custom_data = {
"status": True,
"error": False,
"message": 'message',
"data": serializer.data
}
return Response(custom_data)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
custom_data = {
"status": True,
"error": False,
"message": 'message',
"data": serializer.data
}
return Response(custom_data, status=status.HTTP_201_CREATED, headers=headers)
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
custom_data = {
"status": True,
"error": False,
"message": 'message',
"data": serializer.data
}
return Response(custom_data)
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
custom_data = {
"status": True,
"error": False,
"message": 'message',
"data": serializer.data
}
return Response(custom_data)
and in views i use my custom viewset
from common.baseview import ResponseModelViewSet
class PositionViewsets(ResponseModelViewSet):
serializer_class = PositionSerializer
permission_classes = (IsAuthenticated,)
model = Position
def get_queryset(self):
return Position.objects.filter(order__user=self.request.user)
I am not sure if this is the correct way of doing it or there is some other efficient way to do it. Anyway this works for my custom apps but not for the Authentication app i used the default rest apps
'rest_framework.authtoken',
'rest_auth',
For login using username and password and get the success response as follows.
{
"key": "e642efd0b78e08b57bf34fa999f49b70a7bfe21a"
}
Instead i need this.
{
"status": "200",
"error": "False",
"data": [
{
"token":{
"key":"e642efd0b78e08b57bf34fa999f49b70a7bfe21a"
}
}
],
"message": "Login Sucess"
}
for error
{
"status": "error",
"error": "True",
"data": [
{
"email": ["Enter a valid email address."]
}
],
"message": "Login Failed"
}