Suman Astani
Suman Astani

Reputation: 1191

DestroyAPIView Django rest validation

class DeleteLedgerCategory(DestroyAPIView):
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        queryset = Category.objects.filter(company = self.request.user.currently_activated_company, id=self.kwargs['pk'])
        return queryset

    def preform_destroy(self, instance):
        if instance.is_default == True:
            raise ValueError("Cannot delete default system category")
        return instance.delete()

In above class based view. I need to add custom validation error message. ie. if instance.is_default == True: raise error... and only allow to delete the instance if no error encounters. If any unclear question. Do comment

Upvotes: 1

Views: 8956

Answers (2)

Florian Bigot
Florian Bigot

Reputation: 11

You can use the destroy method here but you have to return a response whether it is successful or not

from rest_framework.response import Response
from rest_framework import status

class DeleteLedgerCategory(DestroyAPIView):
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        queryset = Category.objects.filter(company = self.request.user.currently_activated_company, id=self.kwargs['pk'])
        return queryset

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        if instance.is_default == True:
            return Response("Cannot delete default system category", status=status.HTTP_403_FORBIDDEN)
        self.perform_destroy(instance)
        return Response(status=status.HTTP_204_NO_CONTENT)

Upvotes: 1

neverwalkaloner
neverwalkaloner

Reputation: 47374

Instead of just raise error you can customize response in destroy method:

from rest_framework.response import Response

class DeleteLedgerCategory(DestroyAPIView):
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticated]

    def get_queryset(self):
        queryset = Category.objects.filter(company = self.request.user.currently_activated_company, id=self.kwargs['pk'])
        return queryset

    def destroy(self, request, *args, **kwargs):
        instance = self.get_object()
        if instance.is_default == True:
            return Response("Cannot delete default system category", status=status.HTTP_400_BAD_REQUEST)
        self.perform_destroy(instance)

Upvotes: 11

Related Questions