Django:“DoesNotExist”来自哪里?

时间:2010-01-26 23:29:14

标签: django django-models

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

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

2 个答案:

答案 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一样,是模型类的属性。在生成模型时将其添加到模型中。

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