我一直在Django看到DoesNotExist
像db.models.fields.related.py
一样被提升。不是ObjectDoesNotExist
中定义的django.core.exceptions
,而是DoesNotExist
。这个异常类在哪里定义,或者我不完全理解异常?我已经检查过它不是例外(至少不是我所知道的)。我很困惑。
注意:它也是免费的,作为模型子类实例的属性,如`self.someforeignkey.DoesNotExist。这怎么可能?
答案 0 :(得分:56)
DoesNotExist
记录在案here:
DoesNotExist异常继承 从 django.core.exceptions.ObjectDoesNotExist, 所以你可以定位多个 DoesNotExist例外。
这样您就可以很好地使用except ObjectDoesNotExist:
并捕获DoesNotExist
子句中可能引发的所有特定于模型的try
异常,或者在需要时使用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,), {}))
答案 1 :(得分:7)
DoesNotExist
,就像MultipleObjectsReturned
一样,是模型类的属性。在生成模型时将其添加到模型中。
编辑:负责此过程的元类是ModelBase
(django.db.models.base
),您可以查看它以查看发生了什么。