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


69

我有一个Django模型的自定义管理器。我似乎无法在此处捕获DidNotExist异常。我知道如何在模型中执行此操作,但在这里不起作用:

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


2
在这两种情况下,“无效”是什么意思?实际发生了什么?
Daniel Roseman 2013年

@DanielRoseman NameError:全局名称'DoesNotExist'没有定义
Seperman

Answers:


125

尝试使用ObjectDoesNotExist代替DoesNotExistself.DoesNotExist。如果所有其他方法都失败了,请尝试捕获一个香草Exception并对其进行评估以查看其为type()。

from django.core.exceptions import ObjectDoesNotExist


我尝试了Self.DoesNotExist,但失败了。当数据库中不存在某些内容时,我得到的错误是:NameError: global name 'DoesNotExist' is not defined所以我需要从某个地方导入DidsNotExist。我以为它在models.Model中,但是models.Model.DoesNotExist不起作用。
Seperman

self.DoesNotExist显然无济于事,因为如果self具有这种方法,它就会存在。使用task.DoesNotExist或代替ObjectDoesNotExist
菲利普·

您尝试了我的建议ObjectDoesNotExist吗?其他语法可能是self.model.DoesNotExist ...,但是我不确定。
杰夫·特里特

9
我必须导入ObjectDoesNotExist,并且它可以捕获DidNotExist:from django.db.models.base import ObjectDoesNotExist 谢谢!
Seperman

13

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

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

2

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

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

这是行不通的。您必须使用self.model.DoesNotExist
Sudhakaran Packianathan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.