在Django的自定义管理器中捕获DoesNotExist异常

时间:2013-01-10 09:59:34

标签: python django exception django-custom-manager

我有一个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也不起作用。 这有什么不对?

6 个答案:

答案 0 :(得分:97)

尝试使用ObjectDoesNotExist代替DoesNotExistself.DoesNotExist。如果所有其他方法都失败了,只需尝试捕捉一个香草Exception并评估它以查看它的类型()。

from django.core.exceptions import ObjectDoesNotExist

答案 1 :(得分:10)

正如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

答案 2 :(得分:2)

您可以使用Manager.model(self.model)实例中的DoesNotExist, 当你说objects = MyManager()你在MyManager类中分配self.model时。

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

答案 3 :(得分:1)

在 Django 中,模型中的每个对象都有一个异常属性 DoesNotExists。所以你可以从对象本身或从异常模块调用它。

来自对象 (self):

from django.db import models

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

来自异常模块:

from django.core.exceptions import ObjectDoesNotExist

try:
    return "Calling object"
except ObjectDoesNotExist:
    raise Http404

答案 4 :(得分:0)

如果你需要使用GenericViewSet在列表方法(DRF)上实现它,并且需要返回一个空列表,请使用:

    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)

答案 5 :(得分:0)

我以这种方式处理异常,并且有效。

from django.core.exceptions import ObjectDoesNotExist

try:
    task = self.get(id=kwargs["id"])
except ObjectDoesNotExist as DoesNotExist:
    raise Http404