Перехват исключения 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)