2011-06-01 96 views
0

我的表單驗證是相當不錯的,如果一個形式通過is_valid,所有數據都應該確定在數據庫中插入。我還應該在db模型上驗證一些東西嗎?還有什麼可以在數據庫方面驗證?因爲現在,除了可能的唯一性(我無法從FormModel中完成),我無法想到其他任何東西。我應該在我的db模型中使用哪種驗證?

編輯: 我在之前做了一些Rails的工作,在那裏你將使用JS在客戶端驗證表單,在服務器端使用模型驗證。我看到在Django,你可以驗證在客戶端,使用JS,並在服務器端你有2個驗證檢查:形式和模式。這讓我感到困惑。

+0

如果您需要任何嚴肅的指導,您需要張貼一些代碼。根據你的問題,現在沒有任何人可以真正告訴你。 – 2011-06-01 15:01:02

回答

2

所有數據都應在數據庫中,如果可能,你是否從前端或無法驗證驗證。第一次驗證應該是數據類型,例如使用日期數據類型將確保沒有非日期可以進入數據庫。如果你有表之間的關係,這些絕對必須在數據庫級別執行。如果數據必須是唯一的,那麼不要在其上放置唯一的索引。如果您有一組不同的值,那麼這些值就是唯一允許的值,然後將它們放在查找表中,併爲該表添加一個外鍵約束。

之所以關鍵是要做到驗證數據庫本身是用戶界面不會與數據庫(即使你認爲這將是)交互的唯一的事情。其他應用程序可以這樣做,人們將需要通過進口或在查詢窗口(固定/更改大量數據,比如當客戶端購買客戶端B,你需要將所有的數據轉換成客戶端A)數據的變化。另外,如果更改應用程序界面,則可能會丟失重寫中的一些關鍵數據完整性檢查。數據完整性是數據庫設計和維護中最關鍵的因素之一。如果你不能指望數據的完整性,你沒有數據。我從來沒有見過一個數據庫,可以讓應用程序處理這些數據,而不會隨着時間的推移而丟失數據完整性。記住數據庫將遠遠超過當前的應用程序。人們仍然會在未來幾年中看到這些數據。應用程序通常不會考慮數據完整性問題易於發現的報告。例如,您不想解釋爲什麼您的訂單中有10,000,000個訂單無法識別出貨。

1

如果您的數據有一個始終有效的約束,則應該在模型/數據庫級別(以及可選的表單級別)強制它。除了檢查驗證的表單之外,您的數據庫可以以多種方式輸入。例如,有人可以去django shell直接保存模型,或者有人可以在管理界面中創建/編輯模型,或者某些後來的設計者以某種方式創建一個新表單,但不能正確驗證。

授予如果有對數據附加的約束,這是僅需要。如果您使用正確的字段類型,Django將自動驗證諸如存儲正確值的字段等內容。例如,IntegerField驗證以確保它包含整數,EmailField檢查它是否以有效電子郵件地址的形式輸入,django.contrib.localflavor.us.models.PhoneNumberField是美國電話號碼等。注意,只有當您的模型具有適當的字段(例如,if您使用CharField s作爲電子郵件地址不能進行驗證

但是在數據結構之間可能存在其他的聯繫,您應該在其中編寫自己的驗證,例如,如果所有需要特殊指令的定製訂單(以及非定製訂單隻有有時會有特別的說明),你應該檢查執行所有自定義命令在特殊說明字段中有什麼東西(也許有一些最小長度)。


編輯:在回答您的編輯,在Django的三個潛在驗證的原因很簡單 - 在不同的原因不同位置有不同的驗證。

客戶端(javascript/jquery)驗證根本無法信任,只能作爲用戶使用時的便利(如果您想要一個平滑流暢的界面)。 AFAIK,django沒有JS驗證,除非你使用像django-ajax-forms之類的外部軟件包,但是你不相信驗證是正確的。其次,表單和模型驗證有所不同。一個模型可能有多種形式用於不同的目的。例如,您可能有一個評論模型的博客,並允許兩種類型的用戶評論:登錄用戶或匿名用戶。匿名用戶的表單可能需要在他們發表評論之前給出名稱/電子郵件,而登錄用戶的表單不需要這些字段。登錄用戶表單在視圖中處理時,可能會自動將登錄用戶的正確名稱和電子郵件地址添加到評論模型中,然後才能保存。

相比之下,模型驗證始終適用並且在數據庫級別始終爲真,無論他們如何嘗試保存數據。如果您想確保始終適用某些條件,請確保它處於數據庫級別。 (而且你不必寫這個驗證在表單級別)。

相關問題