我从哪里导入 Django 1.10 中的 `DoesNotExist` 异常?

SeS*_*esa 11 django exception python-3.x

我很难弄清楚这一点。我试图在特定对象不存在的情况下捕获异常,但该行

from django.core.exceptions import DoesNotExist
Run Code Online (Sandbox Code Playgroud)

给我cannot find reference in exeptions.py警告。如果该文件中未指定异常,我在哪里可以找到它?

Wil*_*sem 18

如果模型未知,则异常称为ObjectDoesNotExists[Django-doc],因此您将其导入为:

from django.core.exceptions import ObjectDoesNotExist
Run Code Online (Sandbox Code Playgroud)

Object是用来避免与混乱DoesNotExist例外每种模式都有(你可以看到Object作为所有车型的对象的“泛化”)。

但是请注意,如果您知道您查询的模型的模型是什么,最好使用更受限制的异常,例如:

try:
    SomeModel.objects.get(pk=14)
except SomeModel.DoesNotExist:
    # ... do something
    pass
Run Code Online (Sandbox Code Playgroud)

就像在模型属性 [Django-doc]的文档中指定的一样:

Django 提供了一个DoesNotExist异常作为每个模型类的属性,以识别无法找到的对象的类,并允许您使用 try/except捕获特定的模型类。例外是django.core.exceptions.ObjectDoesNotExist.

这样您就不会 - 偶然地 - 捕获异常,因为无法获取某些(相关)模型。通常,try-except块的跨度应尽可能小,并且异常尽可能“显式”。

  • 我是否需要自己在模型中定义“DoesNotExist”异常?当我尝试使用“SomeModel.DoesNotExist”替代方案时,PyCharm CE 抱怨“类 MyClass”的“未解析的属性引用”。 (2认同)

nev*_*ner 5

它应该是ObjectDoesNotExist

from django.core.exceptions import ObjectDoesNotExist
Run Code Online (Sandbox Code Playgroud)

您还可以捕获特定模型的异常,如下所示:

from .your_models import ModelClass

ModelClass.DoesNotExist
Run Code Online (Sandbox Code Playgroud)