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

Sep*_*man 55 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
Run Code Online (Sandbox Code Playgroud)

Get_object_or_404也不起作用.这有什么不对?

小智 106

尝试使用ObjectDoesNotExist而不是DoesNotExist或可能self.DoesNotExist.如果所有其他方法都失败了,只需尝试捕捉一个香草Exception并评估它以查看它的类型().

from django.core.exceptions import ObjectDoesNotExist

  • 我必须导入ObjectDoesNotExist并且它能够捕获DoesNotExist:`来自django.db.models.base import ObjectDoesNotExist`谢谢! (7认同)

dan*_*bal 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
Run Code Online (Sandbox Code Playgroud)


Thé*_*nza 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)
Run Code Online (Sandbox Code Playgroud)