Search code examples
django-rest-framework

How to return custom response in ListAPIView in django


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"
}

    

Solution

  • 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.