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