Search code examples
django-rest-frameworkdjango-rest-viewsets

How to properly return error when overriding .get_queryset()?


I read on DRF doc that you can filter againt query parameters by overriding .get_queryset(). I am looking for the best practice, on what to return, in case the filters are incorrect and where to return an error message.

The doc I referred to is here And I include the source code below

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        Optionally restricts the returned purchases to a given user,
        by filtering against a `username` query parameter in the URL.
        """
        queryset = Purchase.objects.all()
        username = self.request.query_params.get('username', None)
        if username is not None:
            queryset = queryset.filter(purchaser__username=username)
        return queryset

Thank you for your help


Solution

  • You can do this

    from rest_framework import status
    
    class PurchaseList(generics.ListAPIView):
        serializer_class = PurchaseSerializer
        def get_queryset(self):
            try:
                """
                Optionally restricts the returned purchases to a given user,
                by filtering against a username query parameter in the URL.
                """
                queryset = Purchase.objects.all()
                username = self.request.query_params.get('username', None)
                if username is not None:
                        queryset = queryset.filter(purchaser__username=username)
                return queryset
            except:
                return None
    
        def get(self, request):
            try:
               data=view_serializer(self.get_queryset(),many=True).data
               context = {
                   "data" : data,
                   "message" : "Contents returned successfully",
                   "success" : True
                   }
               return Response(context, status=status.HTTP_200_OK)
            except Exception as error:
               context = {'error': str(error), 'success': "false", 'message': 'Failed To Get contents.'}
               return Response(context, status=status.HTTP_500_INTERNAL_SERVER_ERROR)