2010-01-26 141 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),你可以看看它發生了什麼。