亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年04月30日 17:02:39   作者:大江狗  
這篇文章主要介紹了Django項(xiàng)目如何給數(shù)據(jù)庫添加約束,幫助大家更好的理解和學(xué)習(xí)使用Django框架,感興趣的朋友可以了解下

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

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

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

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

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

常見的約束條件有:

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

在Django中我們可以借助于它的ORM,而不是原始SQL語句創(chuàng)建約束,所以對(duì)SQL語句不熟悉的不用擔(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ù)庫約束。

UniqueConstraint (唯一約束)

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

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

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

CheckConstraint(條件約束)

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

注意

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

小結(jié)

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

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

相關(guān)文章

  • Python 快速把多個(gè)元素連接成一個(gè)字符串的操作方法

    Python 快速把多個(gè)元素連接成一個(gè)字符串的操作方法

    join() 方法一個(gè)用于將序列中的元素以指定的分隔符連接成一個(gè)字符串的方法,這個(gè)方法通常用于字符串操作,這篇文章主要介紹了Python 快速把多個(gè)元素連接成一個(gè)字符串的方法,需要的朋友可以參考下
    2024-06-06
  • python中f字符串以及其常見用法總結(jié)

    python中f字符串以及其常見用法總結(jié)

    python中的f是format函數(shù)的縮寫,用于格式化輸出,下面這篇文章主要給大家介紹了關(guān)于python中f字符串以及其常見用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 分析語音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)

    分析語音數(shù)據(jù)增強(qiáng)及python實(shí)現(xiàn)

    數(shù)據(jù)增強(qiáng)是一種生成合成數(shù)據(jù)的方法,即通過調(diào)整原始樣本來創(chuàng)建新樣本。這樣我們就可獲得大量的數(shù)據(jù)。這不僅增加了數(shù)據(jù)集的大小,還提供了單個(gè)樣本的多個(gè)變體,這有助于我們的機(jī)器學(xué)習(xí)模型避免過度擬合
    2021-06-06
  • Python如何將將模塊分割成多個(gè)文件

    Python如何將將模塊分割成多個(gè)文件

    這篇文章主要介紹了Python如何將將模塊分割成多個(gè)文件,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • python?對(duì)excel交互工具的使用詳情

    python?對(duì)excel交互工具的使用詳情

    這篇文章主要介紹了python?對(duì)excel交互工具的使用詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • tensorflow 實(shí)現(xiàn)自定義layer并添加到計(jì)算圖中

    tensorflow 實(shí)現(xiàn)自定義layer并添加到計(jì)算圖中

    今天小編就為大家分享一篇tensorflow 實(shí)現(xiàn)自定義layer并添加到計(jì)算圖中,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python語言基礎(chǔ)之函數(shù)語法

    Python語言基礎(chǔ)之函數(shù)語法

    這篇文章主要介紹了Python語言基礎(chǔ)中的函數(shù)語法,文中有詳細(xì)的代碼示例供大家參考,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考閱讀下
    2023-05-05
  • 使用Python進(jìn)行大規(guī)模數(shù)據(jù)處理和分析

    使用Python進(jìn)行大規(guī)模數(shù)據(jù)處理和分析

    大規(guī)模數(shù)據(jù)處理和分析旨在從海量數(shù)據(jù)中提取有用的信息和見解,以支持決策制定和業(yè)務(wù)發(fā)展,Python憑借其豐富的生態(tài)系統(tǒng)和強(qiáng)大的庫,為處理和分析數(shù)據(jù)提供了豐富的工具和資源,在本文中,我們將深入探討如何利用Python進(jìn)行大規(guī)模數(shù)據(jù)處理和分析,需要的朋友可以參考下
    2024-05-05
  • 學(xué)習(xí)python的前途 python掙錢

    學(xué)習(xí)python的前途 python掙錢

    在本文里我們給大家整理了關(guān)于學(xué)習(xí)python的前途以及python掙錢的方法整理,有興趣的朋友們閱讀下。
    2019-02-02
  • Python中Pygame模塊的詳細(xì)安裝過程

    Python中Pygame模塊的詳細(xì)安裝過程

    pygame安裝是為了開發(fā)小游戲,在下新手在經(jīng)過許多嘗試后,為大家避雷,給大家分享一個(gè)簡(jiǎn)單有效的方法,下面這篇文章主要給大家介紹了關(guān)于Python中Pygame的詳細(xì)安裝過程的相關(guān)資料,需要的朋友可以參考下
    2022-09-09

最新評(píng)論