Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Django 模型中的三種主要關聯方式

最後更新:2025年2月24日Python

本文為 Django 圖片上傳功能系列教學,第 1 篇:

  1. Django 實現用戶圖片上傳功能:10 步驟詳細解析
  2. Django 圖片上傳功能完整代碼解析
  3. Django 模型中的三種主要關聯方式 👈 所在位置
  4. Django 中的 ImageField:簡單介紹與進階設定
  5. Django 中的 blank=True 和 null=True:深度解析
  6. Django Signals 的基礎入門
  7. 深入解析 Django 的 @receiver 裝飾器:原理與實踐
  8. Django 圖片上傳功能:信號執行函數設計解析
  9. 如何在 Django 中載入和使用信號(Signals)
  10. Django 模型建立後的必備步驟:執行 migrate
  11. 使用 Django 創建用戶個人資訊更新表單
  12. 如何使用 Django 更新用戶個人資料
  13. 深入了解 HTML 表單的 enctype=”multipart/form-data”
  14. Django 中媒體檔案處理:設定與執行解析
  15. Django 專案中靜態與媒體檔案的正確配置指南
  16. Django 動態讀取頭像:模板與上下文的最佳實踐

Django 是一個高效的 Web 框架,擁有強大的 ORM(Object-Relational Mapping)系統,來管理數據庫模型。

在 Django 模型中,關聯方式是設計資料結構的重要部分。

本文將介紹 一對一(One-to-One)、一對多(One-to-Many)、和 多對多(Many-to-Many)三種關聯方式,以及它們的用法和場景。


一對一關聯 (One-to-One Relationship)

Django 字段:OneToOneField

關係描述

一個物件僅能與另一個物件相關聯,雙方是唯一對應關係。

例如,每個用戶(User)對應一個詳細的個人資料(Profile)。

範例

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()

特點

  1. 唯一性:每個 User 只對應一個 Profile,反之亦然。
  2. 反向訪問:可以透過 related_name 訪問對應的物件:
profile = user.profile  # 從 User 訪問 Profile
user = profile.user     # 從 Profile 訪問 User

適用場景

  • 擴展內建的 User 模型。
  • 管理其他需要唯一關聯的物件。

一對多關聯 (One-to-Many Relationship)

Django 字段:ForeignKey

關係描述

一個父物件可以關聯多個子物件,而每個子物件只能屬於一個父物件。

例如,一篇文章(Article)可以有多條評論(Comment),但每條評論只能對應一篇文章。

範例

class Article(models.Model):
    title = models.CharField(max_length=100)

class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
    content = models.TextField()

特點

  1. 反向訪問:通過 related_name 在父物件中訪問所有子物件:
article = Article.objects.get(id=1)
comments = article.comments.all()  # 獲取該文章的所有評論
  1. 默認反向名稱:如果未設置 related_name,Django 預設生成 <模型類名小寫>_set,如 comment_set。

適用場景

  • 主從結構(例如文章與評論)。
  • 層次化資料關係。

多對多關聯 (Many-to-Many Relationship)

Django 字段:ManyToManyField

關係描述

多個物件可以同時關聯多個其他物件。

例如,一篇文章可以有多個標籤(Tag),每個標籤也可以對應多篇文章。

範例

class Tag(models.Model):
    name = models.CharField(max_length=50)

class Article(models.Model):
    title = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag, related_name='articles')

特點

  1. 雙向訪問:
article = Article.objects.get(id=1)
tags = article.tags.all()  # 文章的所有標籤

tag = Tag.objects.get(name="Python")
articles = tag.articles.all()  # 包含該標籤的所有文章
  1. 中間表:Django 自動生成一個隱式中間表來處理多對多關係。

適用場景

  • 標籤系統(文章-標籤)。
  • 學生-課程關係。

總結比較

關聯方式Django 字段典型關係範例
一對一 (One-to-One)OneToOneFieldProfile-User一個用戶對應一個個人資料
一對多 (One-to-Many)ForeignKeyArticle-Comment一篇文章有多條評論,但評論只能屬於一篇文章
多對多 (Many-to-Many)ManyToManyFieldArticle-Tag多篇文章共享多個標籤,標籤可關聯多篇文章
Django 字段OneToOneField
典型關係Profile-User
範例一個用戶對應一個個人資料
Django 字段ForeignKey
典型關係Article-Comment
範例一篇文章有多條評論,但評論只能屬於一篇文章
Django 字段ManyToManyField
典型關係Article-Tag
範例多篇文章共享多個標籤,標籤可關聯多篇文章

這三種關係涵蓋了絕大部分的應用場景,Django 還提供了額外的參數如 related_name、on_delete 等,進一步提升靈活性和可用性。

在設計資料模型時,根據應用場景選擇合適的關聯方式是關鍵!

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

Python

目錄

  • 一對一關聯 (One-to-One Relationship)
  • Django 字段:OneToOneField
  • 關係描述
  • 範例
  • 特點
  • 適用場景
  • 一對多關聯 (One-to-Many Relationship)
  • Django 字段:ForeignKey
  • 關係描述
  • 範例
  • 特點
  • 適用場景
  • 多對多關聯 (Many-to-Many Relationship)
  • Django 字段:ManyToManyField
  • 關係描述
  • 範例
  • 特點
  • 適用場景
  • 總結比較