Подтвердить что ты не робот

Исключение исключения 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 тоже не работает. Что здесь не так?

4b9b3361

Ответ 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)