Перехват исключения DoesNotExist в пользовательском менеджере в Django
У меня есть пользовательский менеджер для модели Django. Кажется, я не могу поймать исключение DoesNotExist здесь. Я знаю, как это сделать внутри модели, но здесь это не сработало:
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 тоже не работает. Что здесь не так?
4 ответов
попробуйте использовать ObjectDoesNotExist
вместо DoesNotExist
или, возможно,self.DoesNotExist
. Если все остальное не удается, просто попробуйте поймать ваниль Exception
и оцените его, чтобы увидеть, что это тип ().
from django.core.exceptions import ObjectDoesNotExist
как предложил панчикор,self.model
- это путь.
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
вы можете использовать DoesNotExist от менеджера.модель (самовыдвижение.экземпляр модели,
когда вы говорите objects = MyManager()
вы назначаете самостоятельно.модель внутри класса MyManager.
try:
task = self.get(id=kwargs["id"])
return task
except self.DoesNotExist:
return None
Если вам нужно реализовать это в методе list (DRF) с помощью GenericViewSet и нужно вернуть пустой список, используйте это:
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)