在 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。
