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

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

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

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

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

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

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

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

# 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 在執(zhí)行 migrate 時(shí)生成的 SQL 如下(MySQL數(shù)據(jù)庫):

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ù)庫中使用外鍵約束,生成以下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ù)庫的級(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ù)庫中的時(shí)間并沒有自動(dòng)更新

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

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

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

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

如create或是save方法。

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

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

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

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 九九久久国产精品 | 国产日韩欧美精品在线 | 美女国产福利视频 | 91福利网 | 爱呦视频在线播放网址 | 亚洲在线观看视频 | 成人欧美一区二区三区在线 | 日本a级精品一区二区三区 日本a级毛片免费视频播放 | 91资源在线观看 | 小明日韩在线看看永久区域 | 亚洲tv成人天堂在线播放 | 午夜视频一区二区三区 | 欧美国产在线观看 | 女人夜色黄网在线观看 | 国产性色 | 国产香蕉尹人综合在线观 | 国产精品久久久久无毒 | 国产成人毛片视频不卡在线 | 最新国产精品亚洲二区 | 成人三级做爰在线视频 | 欧美成人一级毛片 | 国产成人啪一区二区 | 国产在线91精品天天更新 | 国产高清一 | 亚洲国产精品一区二区久 | 毛片在线视频观看 | 日本老熟妇激情毛片 | 国产亚洲精 | 亚洲国产精品二区久久 | 久久国产欧美 | 日韩欧免费一区二区三区 | 免费a级| 国产精品中文 | 黄色毛片在线 | 看国产一级片 | 老司机午夜性生免费福利 | 亚洲香蕉影院 | 国产精品亚洲专区在线播放 | 免费中文字幕在线 | 步兵社区 | 中文字幕123区 |