【问题标题】:Django: Where does "DoesNotExist" come from?Django:“DoesNotExist”从何而来?
【发布时间】:2011-01-09 18:04:48
【问题描述】:

我一直在 Django 中看到 DoesNotExist 像在 db.models.fields.related.py 中一样被提升。不是在django.core.exceptions 中定义的ObjectDoesNotExist,而只是DoesNotExist。这个异常类在哪里定义,或者我没有完全理解异常?我已经检查过它没有例外(至少不是我所知道的)。我显然很困惑。

注意:它也是免费的,作为模型子类实例的属性,例如 `self.someforeignkey.DoesNotExist。这怎么可能?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    DoesNotExist 记录在案 here:

    DoesNotExist 异常继承 从 django.core.exceptions.ObjectDoesNotExist, 所以你可以定位多个 不存在异常。

    因此您可以完美地使用except ObjectDoesNotExist: 并捕获所有可能在try 子句中引发的特定于模型的DoesNotExist 异常,或者当您想要更具体时使用except SomeSpecificModel.DoesNotExist:

    如果您正在查找 Django 源代码中将此属性添加到模型类的特定位置,请参阅here,第 34-37 行:

    # Create the class.
    new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})
    new_class.add_to_class('_meta', Options(attrs.pop('Meta', None)))
    new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))
    

    【讨论】:

    • 谢谢亚历克斯。我不知道 Django 有那个 add_to_class() 方法。我在 Komodo 中搜索了“class DoesNotExist”的文档,结果我头疼不已。
    • 除非需要区分哪个类是 DoesNotExist 的来源(在我的经验中非常罕见),否则用户 ObjectDoesNotExist 会更安全。
    • 我认为几乎在每种情况下,知道引发了哪个异常都会好 100%。毯子except ObjectDoesNotExist: 并不比except: 好。由于您不知道导致异常的原因,因此您的程序可能会根据错误信息采取行动。
    【解决方案2】:

    DoesNotExist,就像MultipleObjectsReturned,是模型类的一个属性。生成模型时将其添加到模型中。

    编辑:负责此过程的元类是 ModelBase (django.db.models.base),您可以查看它以了解发生了什么。

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 2012-06-21
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 2019-02-26
      相关资源
      最近更新 更多