在 Django 中表示一對多關係
資料庫幾乎在任何地方都發揮著關鍵作用,Web 開發就是這樣一個地方也就不足為奇了。使用 SQL 構建表和設定表之間的關係是一項簡單的任務,但 Django 使它變得更加簡單。
本文將介紹如何在 Django 中表示一對多關係。
使用連線點/中介模型表示一對多關係
請參考以下模型的定義。
class Number(models.Model):
number = models.CharField(max_length=10)
class Person(models.Model):
name = models.CharField(max_length=200)
class PersonNumber(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="numbers")
number = models.ForeignKey(Number, on_delete=models.CASCADE, related_name="person")
Number
模型有一個欄位 number
來儲存電話號碼。
Person
模型有一個欄位 name
表示人名。
PersonNumber
是 Number
和 Person
的結點或中介模型。外來鍵與引用的物件具有級聯關係。該模型可用於建立一對多關係以及多對多關係。
所有模型的預設主鍵是 id
,一個整數自動欄位。
由於一個電話號碼只與一個人相關聯,但一個人可以有多個電話號碼,這是一對多的關係。PersonNumber
將用於表示這種關係。
如果變數 person
儲存一個 Person
物件,我們可以使用以下語句輕鬆訪問此人的所有電話號碼。
numbers = person.numbers.objects.all()
此語句將返回 Number
物件的 QuerySet
。
考慮這個例子。
ID | Person | Number |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
5 | 2 | 5 |
6 | 2 | 6 |
7 | 3 | 7 |
一個有 id
1
的人有四個電話號碼,分別是 id
1
、2
、3
和 4
。
一個有 id
2
的人有兩個電話號碼,分別是 id
5
和 6
。
一個 id
3
的人只有一個 id
7
的電話號碼。
使用外來鍵表示一對多關係
請參考以下模型的定義。
class Person(models.Model):
name = models.CharField(max_length=200)
class Number(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
number = models.CharField(max_length=10)
Person
模型有一個欄位 name
表示人名。
Number
模型有一個欄位 number
來儲存電話號碼和對 Person
模型的外來鍵引用。此欄位將儲存此號碼的所有者。外來鍵與引用模型 Person
具有級聯關係。
使用這種結構,我們可以使用外來鍵引用輕鬆地將每個 Number
物件與其各自的所有者相關聯。
如果變數 person
儲存一個 Person
物件,我們可以使用以下語句訪問與此人關聯的所有數字。
numbers = Number.objects.filter(person=person)
該語句將返回一個 Number
物件的 QuerySet
。