Reputation: 53
I am creating an app where I want to return data in certain way, like in normal ListApiView we get direct all the field as response I dont want that
my views.py:
class ListFolders(ListAPIView):
queryset = Folder.objects.all()
serializer_class = FolderSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id', 'name']
after hitting this endpoint if my model is empty i get simple [], i dont want that what I want is like this now I dont know how to do it.
{
"status": "success",
"data" : [],
"msg": "done"
}
Upvotes: 2
Views: 1768
Reputation: 476594
You can override the list
method with:
from rest_framework.response import Response
class ListFolders(ListAPIView):
queryset = Folder.objects.all()
serializer_class = FolderSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id', 'name']
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)
return Response({
'status': 'success',
'data': serializer.data,
'msg': 'done'
})
or we can user a super call and override the data, so:
class ListFolders(ListAPIView):
queryset = Folder.objects.all()
serializer_class = FolderSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['id', 'name']
def list(self, request, *args, **kwargs):
response = super().list(request, *args, **kwargs)
response.data = {'status': 'success', 'data': response.data, 'msg': 'done'}
return response
this will also work if some mixin overrides the list
logic, so this might be better from a software design point-of-view.
Upvotes: 6