《Django Web應用開發實戰》學習筆記 15- Django模型關係(1對1、1對多、多對多)

學習資料

《Django Web應用開發實戰》

數據表關係

一個模型對應數據庫的一張表,但是每張數據表之間是可以存在外鍵關聯的,表與表之間有3種關聯:一對一、一對多、多對多

1.1 一對一關係

一對一關係存在於兩張表種,第一張表的某一行數據只與第二張表的某一行數據相關,這種表被稱爲一對一關係

一對一關係的第一張表A

ID 姓名 國籍 參加節目
1001 王大錘 中國 萬萬沒想到
1002 全智賢 韓國 藍色大海的傳說
1003 刀鋒女王 未知 計劃生育

一對一關係的第二張表B

ID 始於 終於
1001 1988 NULL
1002 1981 NULL
1003 未知 3XXX

表A、B的字段ID分別是一一對應的,並且ID不會重複,使用這種外鍵關聯通常是一張數據表設有太多字段,將常用的字段抽取出來並弄成一張新表,在模型中可以通過OneToOneField來構建數據表的一對一關係

from django.db import models


class Performer(models.Model):
    """相當於表A"""
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=10)
    nationality = models.CharField(max_length=30)
    masterpiece = models.CharField(max_length=50)
    
    
class PerformerInfo(models.Model):
    """相當於表B"""
    id = models.IntegerField(primary_key=True)
    performer = models.OneToOneField(Performer, on_delete=models.CASCADE)
    birth = models.CharField(max_length=20)
    elapse = models.CharField(max_length=20)

Snipaste_2020-11-26_20-44-37.png

1.2 一對多關係

一對多關係存在於兩張或者兩張以上的數據表中,第一張表的某一行以於第二張表的一到多行數據進行關聯,但是第二張表的每一行數據只能於第一張表的某一行進行關聯

一對多關係的第一張表AA

ID 姓名 國籍
1001 王大錘 中國
1002 全智賢 韓國
1003 刀鋒女王 未知

一對多關係的第二張表BB

ID 節目
1001 萬萬沒想到
1002 報告老闆
1003 星際2
1003 英雄聯盟

表AA字段ID的數據不可以重複,但表BB的ID可以重複,字段ID相同的數據對應表AA中的某一行數據,這種表關係在日常開發中更爲常見,可以通過ForeignKey來構建一對多關係

# 一對多
from django.db import models
class Performer(models.Model):
    """相當於表AA"""
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=10)
    nationality = models.CharField(max_length=30)


class Program(models.Model):
    """相當於表BB"""
    id = models.IntegerField(primary_key=True)
    performer = models.ForeignKey(Performer, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

Snipaste_2020-11-26_20-57-53.png

1.3 多對多關係

多對多關係存在於兩張或兩張以上的數據表中,第一張表的某一行數據可以與第二張表的某一到多行數據進行關聯,同時第二張表中的某一行數據也可以與第一張表的一到多行數據進行關聯
多對多關係的第一張表AAA

ID 姓名 國籍
1001 王大錘 中國
1002 全智賢 韓國
1003 刀鋒女王 未知

多對多關係的第二張表BBB

ID 節目
10001 萬萬沒想到
10002 報告老闆
10003 星際2
10004 英雄聯盟

AAA與BBB兩張表的數據關係

ID 節目ID 演員ID
1 10001 1001
2 10001 1002
3 10002 1001

上述表中可以發現,一個演員可以參加多個節目,而一個節目亦可以由多個演員來共同演出,每張表的字段ID都是唯一的,從AAA與BBB數據關係表可以發現,節目ID和演員ID出現了重複的數據分別對應AAA和BBB的字段ID,多對多關係需要使用新的數據表來管理兩張表的數據關係,在模型中可以通過ManyToManyField來構建關係

# 多對多
from django.db import models
class Performer(models.Model):
    """相當於表AAA"""
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=10)
    nationality = models.CharField(max_length=30)


class Program(models.Model):
    """相當於表BBB"""
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=50)
    performer = models.ManyToManyField(Performer)

PS:第三張表在執行遷移和生成命令時自動生成在數據庫中

Snipaste_2020-11-26_21-10-28.png

OneToOneField、ForeignKey、ManyToManyField的特殊參數

參數 描述
to 必選參數,關聯的模型名稱(類名)
on_delete 必選參數,設置數據的刪除模式,包括CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET、DO_NOTHING
limit_choices_to 設置外鍵的下拉框選項,用於模型表單和Admin後臺系統
related_name 用於模型之間的關聯查詢,如反向查詢
related_query_name 設置模型的查詢名稱,用於filter或get查詢,若設置參數related_name,則以其爲默認值,未設置則使用模型名稱的小寫爲默認值
to_field 設置外鍵與其他模型字段的關聯性,默認關聯主鍵,若關聯其他鍵須保證其唯一性
db_constraint 在數據庫裏是否創建外鍵約束默認爲True
swappable 設置關聯模型的替換功能,默認爲True
db_table ManayToManyField,設置表名稱
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章