2014-01-28 28 views
0

在Django中,我希望能夠在模型(或至少數據庫)級別標記某些模型字段,以確保在創建對象時明確指定它們(即不依賴於默認值)。在Django中,如何才能最好地標記模型字段?

目前,Django允許您根據需要在表格級別(通過在模型中指定blank=False)指定模型字段。但是,似乎沒有類似的選項可以在模型或數據庫級別獲得此行爲。

雖然看起來好像有各種各樣的黑客來實現類似的東西。例如,您可以將default設置爲違反數據庫約束的內容。例如,你可以做這樣的事情:

models.CharField(_('characters'), max_length=4, default=None) 

models.CharField(_('characters'), max_length=4, default="abcdef") 

前者的例子,因爲None保存到數據庫時的作品侵犯了默認的null=False非空約束(提高的IntegrityError)。後者的工作原因是保存時引發DataError。但我不知道這是否可以在所有數據庫中正常工作,等等。

我錯過了什麼,還是有更好的方法?

+0

空白=真/假* *是允許在模型級別。請參閱https://docs.djangoproject.com/en/dev/ref/models/fields/#blank對於CharField,它不是數據庫約束,只是表單驗證約束。我認爲如果你做了一個model.full_clean(),然後model.save(),空白= False檢查將執行。 – Nils

+0

@CantucciHQ,我明白這一切。按照「在模型級別所要求的」,我的意思是我希望執行/驗證發生在模型級別,即使表單API沒有被使用。 – cjerdonek

回答

0

如果django模型在save()上自動調用full_clean(),那麼您的檢查將在沒有表單的模型級別運行。我一直在玩django項目中的默認行爲,通過創建一個自動清理模型子類,它在save()上執行full_clean(),然後派生我的模型。

如果您想了解爲什麼它是不是已經是這樣的:Why doesn't django's model.save() call full_clean()?

+1

另請參見Django提交者的答案:http://stackoverflow.com/a/1625760/262819 – cjerdonek

+0

我之前沒有看到過這個解釋,它比我給出的更好。謝謝!基本上,任何缺乏DB驗證的驗證都不是密封的。 – Nils

相關問題