久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

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

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

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

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

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

常見(jiàn)的約束條件有:

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

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

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

UniqueConstraint (唯一約束)

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

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

同樣需要unique_together的字段組合還有(room, date)等。當(dāng)你試圖注冊(cè)相同用戶名和用戶email時(shí),你會(huì)得到如下報(bào)錯(cuò):

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

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

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

CheckConstraint(條件約束)

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

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

注意

無(wú)論你使用UniqueConstraint還是CheckConstraint都必須給它取一個(gè)獨(dú)一無(wú)二的名字。

小結(jié)

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

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

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 青青久久av北条麻妃海外网 | 欧美白人做受xxxx视频 | 99久久99久久精品国产片果冻 | 国产精品久久国产精品 | 久艹伊人| 欧美一级艳片视频免费观看 | 五月婷婷激情 | 欧美在线亚洲 | 亚洲伊人久久综合 | 99久久免费精品国产男女性高好 | 国产精品久久久久久久久 | 精品日韩在线 | 99精品视频在线观看 | 久久综合亚洲 | 色乱码一区二区三区网站 | 成人免费视频网站在线看 | 成人av高清在线观看 | 欧美黑人一区 | 在线播放国产一区二区三区 | 久久久精品网站 | 国产精品久久久久久久午夜片 | 日韩成人一区二区 | 久久福利电影 | 一区在线看| 久久久精品日韩 | 在线精品自拍 | 午夜午夜精品一区二区三区文 | 中文在线视频 | 亚洲中午字幕 | 国产一级中文字幕 | 亚洲视频在线一区 | 国产精品视频久久 | 国产欧美日韩综合精品一 | 久久国产精品免费一区二区三区 | 免费在线国产 | 亚洲精品1 | 久久久久国产一区二区三区四区 | 精品国产一区二区三区久久久蜜月 | 亚洲91精品 | 日韩av一区二区三区四区 | 免费国产在线视频 |