80

我有一个 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

6 回答 6

142

尝试使用ObjectDoesNotExist而不是DoesNotExist或可能self.DoesNotExist。如果一切都失败了,试着抓住一个香草Exception并评估它以查看它的类型()。

from django.core.exceptions import ObjectDoesNotExist

于 2013-01-10T15:18:48.163 回答
16

正如 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
于 2014-05-04T19:46:48.893 回答
6

如果您需要使用 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)
于 2017-03-10T13:38:08.337 回答
2

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

        try:
            task = self.get(id=kwargs["id"])
            return task
        except self.DoesNotExist:
            return None
于 2013-09-07T14:16:19.203 回答
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
于 2021-05-27T03:13:23.417 回答
0

我以这种方式处理异常并且它起作用了。

from django.core.exceptions import ObjectDoesNotExist

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

于 2020-05-30T23:22:28.517 回答