2009-07-10 38 views
0

我使用django,我想知道在什麼情況下模型驗證應該去。至少有兩個變種:ORM的分離和驗證

  1. 驗證模型的保存方法,提高IntegrityError或其他異常,如果業務規則被違反使用形式
  2. 驗證數據和內置clean_ *設施

從一個角度來看,答案很明顯:應該使用基於表單的驗證。這是因爲ORM是ORM,驗證完全是另一個概念。看看CharField:forms.CharField允許min_length指定,但models.CharField不允許。 好酷,但是那些驗證功能在django.db.models中做了什麼?我可以指定CharField不能爲空,我可以在Python中使用EmailField,FileField,SlugField驗證,而不使用RDBMS。此外還有一個URLField,它檢查存在的涉及一些非常複雜的邏輯的url。

從另一個方面,如果我有我想保證它不會被保存或者在不一致的狀態是否從形式來修改/創建一些內部算法的實體。我有一個名稱字段的模型,我期望它應該比一個字符長。我還有一個min_age和一個max_age字段,如果min_age> max_age沒有多大意義。那麼我應該用保存方法檢查這些條件嗎?

模型驗證的最佳實踐是什麼?

回答

0

我不確定這是否是最佳實踐,但我所做的是在將數據推送到數據庫之前,我傾向於驗證客戶端和服務器端。我知道它需要更多的努力,但這可以通過在使用前設置一些值然後進行維護來完成。

您也可以嘗試將** kwargs的大小約束推入在put()調用之前調用的驗證函數。

0

你的兩個選擇是兩個不同的東西。

  • 基於表單的驗證可以被視爲語法驗證+將HTTP請求參數從文本轉換爲Python類型。
  • 基於模型的驗證可以被視爲語義驗證,有時使用在HTTP /表單層不可用的上下文。

當然,DB中有第三層強制執行約束,由於併發請求更新數據庫(例如唯一性約束,樂觀鎖定),因此可能無法在其他任何地方進行檢查。

0

有一個正在進行的Google Summer of Code項目,旨在驗證Django模型圖層。您可以從GSoC學生(Honza Kral)的this presentation瞭解更多信息。還有一個github repository的初步代碼。

直到那個碼能利用到一個Django釋放,一個推薦的方法是使用ModelForms驗證數據,即使源是未一種形式。它在Django核心開發人員之一this blog entry中描述。

0

「但是,在django.db.models中,所有驗證功能都在做什麼?在保存方法:「

一個字。傳統的Django的早期版本有那麼強勁的形式和驗證散落

。‘所以,我要檢查這些條件’

沒有,你呢?應該使用表單的所有驗證。

「什麼是模型驗證的最佳實踐?」 *

使用表單進行所有驗證。

「無論從形式還是來修改/創建一些內部算法」

什麼?如果你的算法遭受精神病發作或你的程序員是反社會病人,那麼 - 也許 - 你必須驗證內部生成的數據。

否則,內部生成的數據按照定義是有效的。只有用戶數據可能無效。如果你不相信你的軟件,那麼寫它有什麼意義?你的單元測試是否被破壞?

+1

這是一個非常理想的假設。我經常不得不使用數據源,而原始創建者對數據驗證的要求並不嚴格。在將數據放入數據庫之前,我仍然需要驗證它們,即使它們不是直接來自表單。這就是爲什麼我對模型驗證GSoC項目的結果非常渴望:-) – 2009-07-10 14:00:13

0

DB /模型驗證

在數據庫中的數據存儲必須始終處於一定的形式/狀態。例如:需要的名字,姓氏,外鍵,唯一約束。這是您應用的邏輯所在。無論您認爲數據來自哪裏 - 應在此處進行「驗證」,並且如果不符合要求,則會引發異常。

表單驗證

被輸入的數據應該權。如果通過其他方式(通過管理員或api調用)輸入此數據,則可以。 例子:人的名字的長度,句子的適當的資本...

例1:對象有一個起始日期結束日期StartDate必須始終在EndDate之前。你在哪裏驗證這個?在模型當然!考慮一下你可能從其他系統導入數據的情況 - 你不希望這樣做。

示例2:密碼確認。你有一個在db中存儲密碼的字段。但是,您在窗體上顯示兩個字段:password1和password2。形式,只有形式,負責比較這兩個領域,看看他們是一樣的。在表單有效之後,您可以安全地將password1字段作爲密碼存儲在數據庫中。