it-roy-ru.com

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

47
Seperman

Попробуйте использовать ObjectDoesNotExist вместо DoesNotExist или, возможно, self.DoesNotExist. Если ничего не помогает, просто попытайтесь поймать Vanilla Exception и оценить его, чтобы увидеть его тип ().

from Django.core.exceptions import ObjectDoesNotExist

93
Jeff Triplett

Как предложил 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
10
danbal

вы можете использовать DoesNotExist из экземпляра Manager.model (self.model), когда вы говорите objects = MyManager(), вы назначаете self.model внутри класса MyManager.

        try:
            task = self.get(id=kwargs["id"])
            return task
        except self.DoesNotExist:
            return None
2
panchicore

Если вам нужно реализовать это в методе списка (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)
0
Théo T. Carranza