2010-01-26 142 views
38

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

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

回答

54

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,), {})) 
+0

感谢亚历克斯。我不知道Django有add_to_class()方法。我在科莫多做了一个'班DoesNotExist'的文档搜索,并在墙上敲打我的头。 – orokusaki 2010-01-27 01:47:27

+0

除非需要明确哪个类是'DoesNotExist'的源(在我的经验中非常罕见),否则用户ObjectDoesNotExist'更安全。 – Marcin 2012-07-25 20:34:34

+3

我认为在几乎所有情况下,知道发生了哪个异常都是100%。除了:',除了ObjectDoesNotExist:'之外的所有内容都不比'更好。既然你不知道是什么导致了异常,你的程序可能会对坏信息采取行动。 – orokusaki 2013-04-10 13:30:06

7

DoesNotExist,就像MultipleObjectsReturned一样,是模型类的一个属性。它在模型生成时被添加到模型中。

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