Django:Where's';“实干家”;来自

Django:Where's';“实干家”;来自,django,django-models,Django,Django Models,在Django的所有时间里,我都看到DoesNotExist像在db.models.fields.related.py中一样被提出。不是django.core.exceptions中定义的ObjectDoesNotExist,而是DoesNotExist。这个异常类是在哪里定义的,还是我没有完全理解异常?我已经检查过它没有例外(至少据我所知没有)。我显然很困惑 注意:它也是免费的,作为模型子类实例的属性,如'self.someforeignkey.DoesNotExist'。这怎么可能呢?Doe

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


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

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


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

DoesNotExist
记录如下:

DoesNotExist异常继承 从…起 django.core.exceptions.ObjectDoesNotExist, 所以你可以瞄准多个目标 DoesNotExist例外

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

如果您正在Django的源代码中寻找将此属性添加到模型类的特定位置,请参见第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()方法。我在科莫多做了一个文档搜索,寻找“类DoesNotExist”,我的头撞到了墙上。除非有必要澄清哪个类是
DoesNotExist
的来源(在我的经验中非常罕见),用户
ObjectDoesNotExist
更安全。我认为,在几乎所有情况下,最好知道引发了哪个异常。除了ObjectDoesNotExist:
之外的一个总括
并不比
除了:
好多少。因为您不知道是什么导致了异常,所以您的程序可能会根据错误信息执行操作。