Catching DoesNotExist exception in a custom manager in Django
I have a custom manager for a Django model. I don't seem to be able to catch DoesNotExist exception here. I know how to do it inside the model but it didn't work here:
class TaskManager(models.Manager):
def task_depend_tree(self, *args, **kwargs):
if "id" in kwargs:
try:
task = self.get(id=kwargs["id"])
except DoesNotExist:
raise Http404
Get_object_or_404 doesn't work either. What is wrong here?
Try either using ObjectDoesNotExist
instead of DoesNotExist
or possibly self.DoesNotExist
. If all else fails, just try and catch a vanilla Exception
and evaluate it to see it's type().
from django.core.exceptions import ObjectDoesNotExist
As panchicore suggested, self.model
is the way to go.
class TaskManager(models.Manager):
def task_depend_tree(self, *args, **kwargs):
if "id" in kwargs:
try:
task = self.get(id=kwargs["id"])
except self.model.DoesNotExist:
raise Http404
If you need to implement this on a list method (DRF) using GenericViewSet, and need an empty list to be returned, use this:
def list(self, request, *args, **kwargs):
self.get_object() # I use this to trigger the object_permission
try:
queryset = self.queryset.filter(user=(YourModel.objects.get(user=request.user).user))
except YourModel.DoesNotExist:
return Response(YourModel.objects.none())
serializer = YSourModelSerializer(queryset, many=True)
return Response(serializer.data)
you can use the DoesNotExist from the Manager.model (self.model) instance,
when you say objects = MyManager()
you are assigning self.model inside MyManager class.
try:
task = self.get(id=kwargs["id"])
return task
except self.DoesNotExist:
return None