學習資料
《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)
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)
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:第三張表在執行遷移和生成命令時自動生成在數據庫中
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,設置表名稱 |