【问题标题】:Where do I import the `DoesNotExist` exception in Django 1.10 from?我从哪里导入 Django 1.10 中的“DoesNotExist”异常?
【发布时间】:2019-02-26 13:52:46
【问题描述】:

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

from django.core.exceptions import DoesNotExist

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

【问题讨论】:

    标签: django python-3.x exception


    【解决方案1】:

    异常被称为<b>Object</b>DoesNotExists [Django-doc],以防模型未知,因此您将其导入为:

    from django.core.exceptions import <b>Object</b>DoesNotExist

    Object 用于避免与每个模型都有的 DoesNotExist 异常混淆(您可以将 Object 视为所有模型对象的“概括”)。

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

    try:
        SomeModel.objects.get(pk=14)
    except SomeModel.DoesNotExist:
        # ... do something
        pass

    就像model attributes [Django-doc]的文档中指定的那样:

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

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

    【讨论】:

    • 我需要自己在模型中定义DoesNotExist 异常吗?当我尝试使用 SomeModel.DoesNotExist 替代方案时,PyCharm CE 抱怨 unresolved attribute reference for class MyClass
    • 不,每个 model(不是每个类,只有 Django 模型)都添加了一个 DoesNotExist 异常。
    • 所以这可能只是 PyCharm CE 对语法不满意的一个例子,因为只有商业版支持 Django。
    • @TheSodesa:我认为 CE 版没有 Django 插件。 PyCharm 专业版有一些额外的工具可以解析 Django 动态添加到模型中的属性(通常不会被标准程序分析拾取)。
    • Pycharm 商业在这里与 Django 的所有其他设置.. 仍然抱怨:-/
    【解决方案2】:

    应该是ObjectDoesNotExist:

    from django.core.exceptions import ObjectDoesNotExist
    

    您还可以像这样捕获特定模型的异常:

    from .your_models import ModelClass
    
    ModelClass.DoesNotExist
    

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 2016-12-07
      • 2011-09-03
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多