Muhammad Adeel Irshad
Muhammad Adeel Irshad

Reputation: 53

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

    

Upvotes: 2

Views: 1768

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

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

Related Questions