Django項目如何給數據庫添加約束

隻要你的Web開發知識不是語文老師教的,那麼你應該已經知道一個合格的開發者應該永遠抱著懷疑的眼光看用戶提交的數據。你不僅需要在前端通過表單或其它方式進行驗證,還需要在後臺視圖拿到用戶發送的數據後再對其進行驗證一遍。假如有一天你開發一個少兒不宜的網站,你的用戶模型裡有年齡(age)這個字段而你要求每個註冊用戶年齡都大於18歲,在Django中你當然可以自定義表單的clean方法, 自定義validators或者重寫模型的save方法對年齡字段進行驗證。然而你想過沒有一件事沒有?這能阻止某個員工或用戶通過Django的admin後臺或數據庫可視化工具對數據庫進行修改,把用戶的年齡修改到18歲以下嗎?當然不能。

劃重點:前後端的數據驗證並不能保證數據庫裡數據的正確性和有效性,在數據庫層面添加一些約束條件是最根本的解決方法。

今天我們就來看下如何在Django項目中給數據庫添加約束(Constraints)。

什麼是數據庫約束(db constraints)基本常識

數據庫約束(Contraints)是在數據庫層面對表中的數據進行進一步的限制, 保證數據的正確性、有效性和完整性(data integrity)。 約束通常與一個表相關聯,並使用CREATE CONSTRAINT或CREATE ASSERTION SQL語句創建。他們定義數據庫中的數據必須符合的某些屬性。他們可以應用於列,整個表格,多個表格或整個模式。

常見的約束條件有:

  • not null – 列中的每個值都不能為NULL
  • primary key – 指定列中的值對於表中的每一行必須是唯一的,而不是NULL ; 
  • unique – 對於表中的每一行必須是唯一的
  • check – 指定一個表達式,為瞭滿足約束條件,它必須計算為真

在Django中我們可以借助於它的ORM,而不是原始SQL語句創建約束,所以對SQL語句不熟悉的不用擔心看不懂本文。not null和primary key這兩個約束Django通常在創建數據表時會自動幫你加上,比如primary key永遠是唯一的。如果你在定義模型時給某個字段設置瞭null=True, 那麼Django就會取消not null的自動約束。

今天我們著重看下如何添加unique和check這兩個常用的數據庫約束。

UniqueConstraint (唯一約束)

假如我們有如下一個員工(employee)模型,我們希望讓姓名(name)和email這個組合變得唯一,我們可以在Meta選項中定義一個unique_together元組。這樣Django會自動為你創建數據庫約束。

同樣需要unique_together的字段組合還有(room, date)等。當你試圖註冊相同用戶名和用戶email時,你會得到如下報錯:

由於unique_together這個方法將來會被淘汰,Django 2.2後建議在Meta.constraints選項中定義UniqueConstraints。它有兩個屬性,一是需要unique的字段或字段組合(fields),二是要給它取個名字(name)。

CheckConstraint(條件約束)

條件約束確保一個模型實例隻有滿足一定的規則條件後才被創建,不滿足條件的數據不會存入到數據庫。下例增加瞭一個對員工年齡的約束,隻有大於18歲的才能註冊。

註意

無論你使用UniqueConstraint還是CheckConstraint都必須給它取一個獨一無二的名字。

小結

前後端數據驗證並不能總是保證數據庫裡數據的有效性和完整性。Django中可以通過Meta.constraints選項輕松定義數據庫層面的UniqueConstraint(唯一約束)和CheckConstraint(條件約束)。新知識學到瞭嗎?歡迎留言。

以上就是Django項目如何給數據庫添加約束的詳細內容,更多關於Django 給數據庫添加約束的資料請關註WalkonNet其它相關文章!

推薦閱讀: