在 Django 中表示一對多關係

Vaibhav Vaibhav 2023年1月30日 2021年6月29日
  1. 使用連線點/中介模型表示一對多關係
  2. 使用外來鍵表示一對多關係
在 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 表示人名。

PersonNumberNumberPerson 的結點或中介模型。外來鍵與引用的物件具有級聯關係。該模型可用於建立一對多關係以及多對多關係。

所有模型的預設主鍵是 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 1234
一個有 id 2 的人有兩個電話號碼,分別是 id 56
一個 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

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

LinkedIn GitHub