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

我有个 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也不起作用。 怎么了?

66189 次浏览

尝试使用 ObjectDoesNotExist而不是 DoesNotExist或者可能使用 self.DoesNotExist。如果所有其他方法都失败了,只需尝试捕获一个普通的 Exception并对其进行评估以查看它的 type ()。

from django.core.exceptions import ObjectDoesNotExist

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

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

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

如果您需要使用 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)

我用这种方式处理异常,它起作用了。

from django.core.exceptions import ObjectDoesNotExist


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


在 Django 中,model 中的每个对象都有一个异常属性 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