色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Django項目如何給數(shù)據(jù)庫添加約束

瀏覽:3日期:2024-09-08 11:00:12

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

劃重點:前后端的數(shù)據(jù)驗證并不能保證數(shù)據(jù)庫里數(shù)據(jù)的正確性和有效性,在數(shù)據(jù)庫層面添加一些約束條件是最根本的解決方法。

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

什么是數(shù)據(jù)庫約束(db constraints)基本常識

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

常見的約束條件有:

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

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

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

UniqueConstraint (唯一約束)

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

Django項目如何給數(shù)據(jù)庫添加約束

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

Django項目如何給數(shù)據(jù)庫添加約束

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

Django項目如何給數(shù)據(jù)庫添加約束

CheckConstraint(條件約束)

條件約束確保一個模型實例只有滿足一定的規(guī)則條件后才被創(chuàng)建,不滿足條件的數(shù)據(jù)不會存入到數(shù)據(jù)庫。下例增加了一個對員工年齡的約束,只有大于18歲的才能注冊。

Django項目如何給數(shù)據(jù)庫添加約束

注意

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

小結(jié)

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

以上就是Django項目如何給數(shù)據(jù)庫添加約束的詳細內(nèi)容,更多關于Django 給數(shù)據(jù)庫添加約束的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Django
相關文章:
主站蜘蛛池模板: 一级国产视频 | 欧美一级性视频 | 欧美日本一区亚洲欧美一区 | 欧美一级毛片生活片 | 久久久久久久99精品免费 | 国产99高清一区二区 | 三级全黄的全黄三级三级播放 | 香蕉久久夜色精品国产2020 | 中文国产成人精品久久96 | 国产午夜免费不卡精品理论片 | 天天摸天天爽视频69视频 | www.久草视频 | 国产成人免费观看在线视频 | 在线国产一区二区三区 | 一级成人黄色片 | 国产成人精品在线 | 国产在线一区二区三区在线 | www女人| 色夜视频 | 成人久久18免费网站 | 国产在线观看成人免费视频 | 亚洲视频在线a视频 | 99国产高清久久久久久网站 | 亚洲视频区| 九九国产精品 | 国产一区二区三区免费在线视频 | 国产精品久久九九 | 中文字幕有码在线 | 国产精品视频自拍 | 看全色黄大色黄大片毛片 | 国产精品一区在线播放 | 日本视频在线观看不卡高清免费 | 久久精品一品道久久精品9 久久精品一区 | 一区自拍 | 精品国产亚一区二区三区 | 国产成人一区二区三区免费观看 | 亚洲精品久久久久综合91 | 一区二区三区亚洲视频 | 看a网址| 在线观看亚洲成人 | tube69xxx最新片|