亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

Django ForeignKey與數據庫的FOREIGN KEY約束詳解

瀏覽:3日期:2024-10-03 13:51:37

數據庫在高并發的場景下使用外鍵約束會有鎖問題并且使用外鍵會增加運維成本,所以很多公司都規定生產環境的數據庫禁止使用外鍵。

那么不使用外鍵約束的情況下使用 Django ORM 如何實現關聯查詢兩個表呢?這曾是困擾我很久的一個問題,今天終于找到了答案,寫出來分享一下。

Django 的 ForeignKey 和數據庫的 FOREIGN KEY 并不一樣。Django 的 ForeignKey 是一種邏輯上的兩個表的關聯關系,可以指定是否使用數據庫的 FOREIGN KEY 約束。

在開頭提到的場景下,我們可以這樣創建兩個表對應的 Model,以省和市的關聯舉例:

# demo/models.pyfrom django.db import modelsclass Province(models.Model): name = models.CharField(max_length=16) def __unicode__(self): return self.nameclass 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 在執行 migrate 時生成的 SQL 如下(MySQL數據庫):

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 參數,會在數據庫中使用外鍵約束,生成以下SQL:

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

另外,ForeignKey 的 on_delete 參數默認為 on_delete=models.CASCADE,表示使用數據庫的級聯刪除,使用 on_delete=models.SET_NULL 可以使刪除 Province 時將關聯的 City 表對應的 province_id 值設為 NULL

使用這種方式不會破壞 Django 的反向關聯查詢,以下查詢仍然會返回正確的結果:

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

實際執行的 SQL 為一個 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;

補充知識:關于Django模型中中定義auto_now=True 數據庫中的時間并沒有自動更新

django的orm關于更新數據庫的方法有update和save兩種方法。

前提在模型中設置了auto_now=True時間戳屬性,為了方便數據庫自動更新時間,而

使用update更新的記錄,數據庫中并沒有自動更新,達到我的需求。

auto_now=True自動更新,有一個條件,就是要通過django的model層。

如create或是save方法。

如果是filter之后update方法,則直接調用的是sql,不會通過model層,

所以不會自動更新此時間。所以使用save方法更新才能達到我的需求。

以上這篇Django ForeignKey與數據庫的FOREIGN KEY約束詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
主站蜘蛛池模板: 三a级片 | 一级一毛片a级毛片欧美 | 男女性高爱潮免费的国产 | 婷婷综合社区 | 色天天天综合色天天碰 | 日本xxx免费视频 | 99精品国产成人一区二区在线 | 正在播放一区二区 | 欧美色影视| 国产精品一级香蕉一区 | 成人五级毛片免费播放 | 男人狂躁女人下面视频免费观看 | 久操视频免费 | 91精品国产综合成人 | 91aaa免费观看在线观看资源 | 亚洲国产综合人成综合网站00 | 国产111111在线观看 | 欧美日本一区亚洲欧美一区 | 国产视频在线播放 | 成人免费v片在线观看 | 欧美日本一区亚洲欧美一区 | 久久国产这里只精品免费 | 久久大香萑太香蕉综合网 | 中文字幕久久亚洲一区 | 欧美成人综合在线观看视频 | 永久国产 | 国产精品1区2区 | 国产综合久久久久 | 永久免费看的啪啪网站 | 在线免费观看一区二区三区 | 色婷婷在线影院 | 视频一区二区不卡 | 欧美午夜a级精美理论片 | 最刺激黄a大片免费观看 | 日韩欧美在线中文字幕 | 国产日产欧美一区二区三区 | 国产精品片 | 国产精品一区二区免费 | 成人精品一区二区www | 国产91av在线 | 131美女爽爽爽爱做视频 |