欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

# 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 時生成的 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')

實際執(zhí)行的 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約束詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 使用python實現鏈表操作

    使用python實現鏈表操作

    鏈表是計算機科學里面應用最廣泛的數據結構之一。這篇文章主要介紹了使用python實現鏈表操作,需要的朋友可以參考下
    2018-01-01
  • 深入理解python Matplotlib庫的高級特性

    深入理解python Matplotlib庫的高級特性

    Matplotlib是一款極其強大的Python數據可視化庫,這篇文章中,我們將深入討論 Matplotlib 的一些高級特性,包括對象導向接口、自定義顏色映射和樣式、動態(tài)圖形等,感興趣的小伙伴跟著小編一起來探討吧
    2023-07-07
  • Python獲取瀏覽器窗口句柄過程解析

    Python獲取瀏覽器窗口句柄過程解析

    這篇文章主要介紹了Python獲取瀏覽器窗口句柄過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Python?+?Tkinter連接本地MySQL數據庫簡單實現注冊登錄

    Python?+?Tkinter連接本地MySQL數據庫簡單實現注冊登錄

    這篇文章主要介紹了Python?+?Tkinter連接本地MySQL數據庫簡單實現注冊登錄。下面文章著情介紹,需要的小伙伴可以參考一下
    2022-01-01
  • python PIL模塊的基本使用

    python PIL模塊的基本使用

    這篇文章主要介紹了python PIL模塊的基本使用,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下
    2020-09-09
  • 在python plt圖表中文字大小調節(jié)的方法

    在python plt圖表中文字大小調節(jié)的方法

    今天小編就為大家分享一篇在python plt圖表中文字大小調節(jié)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Apache,wsgi,django 程序部署配置方法詳解

    Apache,wsgi,django 程序部署配置方法詳解

    這篇文章主要介紹了Apache,wsgi,django 程序部署配置方法,結合實例形式詳細分析了Linux環(huán)境下Apache,wsgi,django程序部署配置的相關操作技巧與注意事項,需要的朋友可以參考下
    2019-07-07
  • Python循環(huán)語句之break與continue的用法

    Python循環(huán)語句之break與continue的用法

    這篇文章主要介紹了Python循環(huán)語句之break與continue的用法,是Python入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Python爬蟲之Spider類用法簡單介紹

    Python爬蟲之Spider類用法簡單介紹

    這篇文章主要介紹了Python爬蟲之Spider類用法簡單介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • pytorch之Resize()函數具體使用詳解

    pytorch之Resize()函數具體使用詳解

    這篇文章主要介紹了pytorch之Resize()函數具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02

最新評論