[Django]-Django Rest Framework: Respond with 404 if no result found

4👍

✅

You can override viewset’s list method for this:

from rest_framework import status
from rest_framework.response import Response

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())
    if not queryset.exists():
        return Response({"detail": "Not found."}, status=status.HTTP_404_NOT_FOUND)

    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(serializer.data)

4👍

I think the easiest way for you (and maybe the most general) will be to override the list() method of ModelViewSet. This is the code (from mixins.py):

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(serializer.data)

Above is the original code. You can then override it in your class, for example, you can add the following lines (after queryset = and before page =)

  ...
 if queryset.count():
    raise exceptions.NotFound()
 ...

Actually, you can do what ever you want now. You can also change the function to return single object.

Leave a comment