最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django ForeignKey與數(shù)據(jù)庫(kù)的FOREIGN KEY約束詳解

 更新時(shí)間:2020年05月20日 09:32:11   作者:唯美落葉  
這篇文章主要介紹了Django ForeignKey與數(shù)據(jù)庫(kù)的FOREIGN KEY約束詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

數(shù)據(jù)庫(kù)在高并發(fā)的場(chǎng)景下使用外鍵約束會(huì)有鎖問(wèn)題并且使用外鍵會(huì)增加運(yùn)維成本,所以很多公司都規(guī)定生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)禁止使用外鍵。

那么不使用外鍵約束的情況下使用 Django ORM 如何實(shí)現(xiàn)關(guān)聯(lián)查詢兩個(gè)表呢?這曾是困擾我很久的一個(gè)問(wèn)題,今天終于找到了答案,寫(xiě)出來(lái)分享一下。

Django 的 ForeignKey 和數(shù)據(jù)庫(kù)的 FOREIGN KEY 并不一樣。Django 的 ForeignKey 是一種邏輯上的兩個(gè)表的關(guān)聯(lián)關(guān)系,可以指定是否使用數(shù)據(jù)庫(kù)的 FOREIGN KEY 約束。

在開(kāi)頭提到的場(chǎng)景下,我們可以這樣創(chuàng)建兩個(gè)表對(duì)應(yīng)的 Model,以省和市的關(guān)聯(lián)舉例:

# demo/models.py
from django.db import models

class Province(models.Model):
  name = models.CharField(max_length=16)

  def __unicode__(self):
    return self.name

class City(models.Model):
  name = models.CharField(max_length=16)
  province = models.ForeignKey(Province, null=True, on_delete=models.SET_NULL,
                 related_name='cities', db_constraint=False)
  def __unicode__(self):
    return self.name

以上的 models.py 在執(zhí)行 migrate 時(shí)生成的 SQL 如下(MySQL數(shù)據(jù)庫(kù)):

CREATE TABLE `demo_city` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(16) NOT NULL);
CREATE TABLE `demo_province` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(16) NOT NULL);
ALTER TABLE `demo_city` ADD COLUMN `province_id` integer NULL;
CREATE INDEX `demo_city_province_id_50fffd49` ON `demo_city` (`province_id`);

如果 ForeignKey 不添加db_constraint=False 參數(shù),會(huì)在數(shù)據(jù)庫(kù)中使用外鍵約束,生成以下SQL:

ALTER TABLE `demo_city` ADD CONSTRAINT `demo_city_province_id_aff53934_fk_key_province_id` FOREIGN KEY (`province_id`) REFERENCES `demo_province` (`id`);

另外,F(xiàn)oreignKey 的 on_delete 參數(shù)默認(rèn)為 on_delete=models.CASCADE,表示使用數(shù)據(jù)庫(kù)的級(jí)聯(lián)刪除,使用 on_delete=models.SET_NULL 可以使刪除 Province 時(shí)將關(guān)聯(lián)的 City 表對(duì)應(yīng)的 province_id 值設(shè)為 NULL

使用這種方式不會(huì)破壞 Django 的反向關(guān)聯(lián)查詢,以下查詢?nèi)匀粫?huì)返回正確的結(jié)果:

Province.objects.filter(cities__name='xxx')

實(shí)際執(zhí)行的 SQL 為一個(gè) Inner Join 查詢:

SELECT `demo_province`.`id`, `demo_province`.`name` FROM `demo_province` INNER JOIN `demo_city` ON (`demo_province`.`id` = `demo_city`.`province_id`) WHERE `demo_city`.`name` = xxx;

補(bǔ)充知識(shí):關(guān)于Django模型中中定義auto_now=True 數(shù)據(jù)庫(kù)中的時(shí)間并沒(méi)有自動(dòng)更新

django的orm關(guān)于更新數(shù)據(jù)庫(kù)的方法有update和save兩種方法。

前提在模型中設(shè)置了auto_now=True時(shí)間戳屬性,為了方便數(shù)據(jù)庫(kù)自動(dòng)更新時(shí)間,而

使用update更新的記錄,數(shù)據(jù)庫(kù)中并沒(méi)有自動(dòng)更新,達(dá)到我的需求。

auto_now=True自動(dòng)更新,有一個(gè)條件,就是要通過(guò)django的model層。

如create或是save方法。

如果是filter之后update方法,則直接調(diào)用的是sql,不會(huì)通過(guò)model層,

所以不會(huì)自動(dòng)更新此時(shí)間。所以使用save方法更新才能達(dá)到我的需求。

以上這篇Django ForeignKey與數(shù)據(jù)庫(kù)的FOREIGN KEY約束詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python實(shí)現(xiàn)單向鏈表詳解

    python實(shí)現(xiàn)單向鏈表詳解

    這篇文章主要介紹了python實(shí)現(xiàn)單向鏈表詳解,分享了相關(guān)代碼示例,每一步操作前都有簡(jiǎn)單分析,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • python利用pd.cut()和pd.qcut()對(duì)數(shù)據(jù)進(jìn)行分箱操作

    python利用pd.cut()和pd.qcut()對(duì)數(shù)據(jù)進(jìn)行分箱操作

    本文主要介紹了python利用pd.cut()和pd.qcut()對(duì)數(shù)據(jù)進(jìn)行分箱操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python機(jī)器學(xué)習(xí)之KNN近鄰算法

    Python機(jī)器學(xué)習(xí)之KNN近鄰算法

    KNN可以說(shuō)是最簡(jiǎn)單的分類算法之一,同時(shí),它也是最常用的分類算法,文中非常詳細(xì)的介紹了該算法,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • python requests庫(kù)的使用

    python requests庫(kù)的使用

    這篇文章主要介紹了python requests庫(kù)的使用,幫助大家更好的利用python進(jìn)行爬蟲(chóng),感興趣的朋友可以了解下
    2021-01-01
  • 使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)

    使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù)

    今天小編就為大家分享一篇關(guān)于使用Python向C語(yǔ)言的鏈接庫(kù)傳遞數(shù)組、結(jié)構(gòu)體、指針類型的數(shù)據(jù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Python實(shí)戰(zhàn)之夢(mèng)幻鋼琴小游戲的實(shí)現(xiàn)

    Python實(shí)戰(zhàn)之夢(mèng)幻鋼琴小游戲的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言編寫(xiě)一款界面化的(Tkinter)電子鋼琴小程序,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-02-02
  • Python數(shù)據(jù)分析與處理(二)——處理中國(guó)地區(qū)信息

    Python數(shù)據(jù)分析與處理(二)——處理中國(guó)地區(qū)信息

    這篇文章主要介紹了Python數(shù)據(jù)分析與處理-處理中國(guó)地區(qū)信息,上文介紹了北京高考分?jǐn)?shù)線統(tǒng)計(jì)分析,這篇文章依然圍繞Python數(shù)據(jù)分析與處理的相關(guān)資料來(lái)介紹處理中國(guó)地區(qū)信息,需要的朋友可以參考一下
    2021-12-12
  • 對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解

    對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解

    今天小編就為大家分享一篇對(duì)Python中TKinter模塊中的Label組件實(shí)例詳解,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python matplotlib繪圖設(shè)置圖例案例

    Python matplotlib繪圖設(shè)置圖例案例

    這篇文章主要給大家分享Python matplotlib繪圖設(shè)置圖例案例,過(guò)程會(huì)學(xué)到edgecolor 圖例邊框線顏色 facecolor 圖例背景色 shadow 是否添加陰影 title 圖例標(biāo)題 fontsize 設(shè)置字體大小,小編覺(jué)得挺有意思的,感興趣的小伙伴也可以參考一下
    2021-12-12
  • Python中的np.vstack()和np.hstack()詳解

    Python中的np.vstack()和np.hstack()詳解

    這篇文章主要介紹了np.vstack()和np.hstack(),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04

最新評(píng)論

巴彦县| 常德市| 自治县| 灵石县| 荔波县| 淮阳县| 溧阳市| 龙里县| 鄂尔多斯市| 津市市| 宜兰县| 安国市| 新密市| 淄博市| 黔西| 屏东市| 眉山市| 陆丰市| 安国市| 景泰县| 高阳县| 凌源市| 方山县| 蒙自县| 察雅县| 贵州省| 巴里| 通化县| 五指山市| 托里县| 德惠市| 玛沁县| 湟源县| 新丰县| 四川省| 福海县| 同心县| 宣武区| 克什克腾旗| 扬中市| 泽州县|