Django ORM多對多關系實戰指南

一、Django 多對多關系的原理

在關系型數據庫中,多對多關系通常需要 第三張中間表 來維護兩張表之間的對應關系。
在 Django 中,你只需要定義 ManyToManyField,Django 會自動幫你創建這張中間表。

特點:

  • 可以雙向查詢(正向 + 反向)
  • 支持添加、刪除、清空操作(add()remove()clear()
  • 可以通過 through 參數自定義中間表,添加額外字段(例如時間戳、角色等)

二、實戰案例:學生和課程系統

假設我們有一個 學生(Student)課程(Course) 的關系:

  • 一個學生可以選多門課程
  • 一門課程可以被多個學生選

1. 定義模型

# models.py
from django.db import modelsclass Course(models.Model):name = models.CharField(max_length=100)  # 課程名稱teacher = models.CharField(max_length=100)  # 授課老師def __str__(self):return self.nameclass Student(models.Model):name = models.CharField(max_length=100)  # 學生姓名age = models.IntegerField()# 多對多關系courses = models.ManyToManyField(Course, related_name="students")def __str__(self):return self.name

執行 python manage.py makemigrations && python manage.py migrate 后,Django 會自動生成一張中間表:

appname_student_courses  # student_id, course_id

在這里插入圖片描述


2. 數據操作示例

創建數據
# 創建課程
math = Course.objects.create(name="數學", teacher="張老師")
english = Course.objects.create(name="英語", teacher="李老師")# 創建學生
s1 = Student.objects.create(name="小明", age=18)
s2 = Student.objects.create(name="小紅", age=19)# 關聯課程
s1.courses.add(math, english)   # 小明選了數學、英語
s2.courses.add(math)            # 小紅只選了數學

查詢操作
# 查詢小明選了哪些課程
student = Student.objects.get(name="小明")
student.courses.all()  # <QuerySet [<Course: 數學>, <Course: 英語>]># 查詢選了數學的學生
math = Course.objects.get(name="數學")
math.students.all()  # <QuerySet [<Student: 小明>, <Student: 小紅>]>

刪除和清空
# 小明退選英語
student.courses.remove(english)# 小紅退選所有課程
s2.courses.clear()

3. 自定義中間表(through)

在這里插入圖片描述

如果我們希望記錄 學生選課的時間,就需要手動定義中間表:

class StudentCourse(models.Model):student = models.ForeignKey(Student, on_delete=models.CASCADE)course = models.ForeignKey(Course, on_delete=models.CASCADE)selected_at = models.DateTimeField(auto_now_add=True)  # 選課時間class Meta:unique_together = ("student", "course")  # 防止重復選課class Student(models.Model):name = models.CharField(max_length=100)age = models.IntegerField()courses = models.ManyToManyField(Course, through="StudentCourse", related_name="students")

使用時:

# 小明選數學,并記錄時間
StudentCourse.objects.create(student=s1, course=math)# 查詢小明所有選課記錄(帶時間)
StudentCourse.objects.filter(student=s1)

三、總結

  • ManyToManyField 簡化了多對多關系的操作,不需要手動建中間表。
  • 可以使用 add()remove()clear() 來維護關系。
  • 如果需要額外字段,可以通過 through 自定義中間表。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98071.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98071.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98071.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32 單片機開發 - TIM 定時器(PWM)

一、硬件定時器高級控制定時器 Advanced Control Timers (TIM1/TIM8)通用定時器 General Purpose Timers (TIM2/TIM3/TIM4/TIM5)通用定時器 General Purpose Timers (TIM15/TIM16/TIM17)基本定時器 Basic Timers (TIM6/TIM7)表 1 定時器種類二、TIM 中 PWM 概念PWM 的基本原理就…

OpenCV內置分類器實現簡單的人臉識別

引言 人臉檢測是計算機視覺領域的基礎任務之一&#xff0c;廣泛應用于安防監控、人機交互、圖像美化等場景。今天我們將通過一段簡潔的Python代碼&#xff0c;使用OpenCV庫實現實時攝像頭人臉檢測功能。無論你是計算機視覺新手還是有經驗的開發者&#xff0c;這篇文章都能幫你理…

Tomcat 性能優化與高并發調優

Tomcat 性能優化與高并發調優1. 引言 經過前幾篇文章的學習&#xff0c;我們已經掌握了 Tomcat 的核心原理&#xff1a; Connector 連接器容器體系&#xff08;Engine → Host → Context → Wrapper&#xff09;Servlet 執行鏈路線程模型&#xff08;Executor Worker&#xf…

MacOS M1安裝face_recognition

MacOS M1安裝face_recognition一致失敗&#xff0c;嘗試網上各種方法還是失敗&#xff0c;遂分享自己安裝成功的經歷。 conda虛擬環境python版本&#xff1a;3.9.23準備工作確保 Homebrew 已安裝 Homebrew 是 macOS 的包管理器&#xff0c;用于安裝依賴項。如果尚未安裝&#x…

動態庫和靜態庫的鏈接加載

靜態庫的鏈接與加載靜態庫&#xff08;如.a或.lib文件&#xff09;在編譯時直接鏈接到可執行文件中。編譯器會將靜態庫中實際用到的代碼復制到最終的可執行文件&#xff0c;生成獨立的二進制文件。優點是不依賴外部庫文件&#xff0c;但會導致可執行文件體積較大。生成靜態庫的…

如何處理在pytorch環境中已經安裝的matplotlib無法使用的問題

1 問題已經安裝好的matplotlib包無法在pytorch環境中使用。2 方法方法一&#xff1a;用命令安裝matplotlib &#xff1a;方法二&#xff1a;打開cmd&#xff0c;使用conda install matplotlib命令安裝matplotlib庫#輸入以下代碼段&#xff0c;查詢當前執行路徑import osos.sys.…

Linux基礎命令匯總

系統基礎指令 ls:列出目錄內容 ls -a:顯示所有文件(包括隱藏文件) ls -l:顯示詳細文件信息 ls /etc:列出 /etc 目錄內容 示例: cat:查看文件內容 cat /etc/os-release:查看系統版本信息 cat file1:顯示文件內容 cat file1 file2 > merged.txt:合并文件并輸出到新…

一場史詩級的冒險——Docker命令大航海!

各位親愛的開發者、運維勇士、以及所有對現代化軟件部署充滿好奇的小伙伴們&#xff01;今天&#xff0c;我們將開啟一場史詩級的冒險——Docker命令大航海&#xff01;我們將乘坐“Docker號”巨輪&#xff0c;駛向容器化技術的星辰大海。 這不是一篇枯燥的說明書&#xff0c;而…

告別依賴混亂:Spring IoC 容器與 DI 依賴注入入門精講

目錄 什么是 IoC IoC 介紹 傳統開發思路 解決方法 IoC 優勢 DI IoC & DI 使用 IoC 詳解 Bean 的存儲 Controller&#xff08;控制器存儲&#xff09; 獲取 bean 對象的其他方法 bean 命名 面試題之 ApplicationContext pk BeanFactory Service&#xff08;服…

視頻理解學習筆記

目錄 VideoRefer VideoPrism 核心解密&#xff1a;通用視頻編碼器的力量 VideoRefer VideoRefer 是由浙江大學和阿里達摩院聯合推出的視頻對象感知與推理技術&#xff0c;增強視頻大型語言模型&#xff08;Video LLMs&#xff09;的空間-時間理解能力。簡單一點來說就是可以…

P1198題解

題目鏈接 開題第一件事看數據范圍.這里的范圍是二十萬,支持O(nlogn). 這是一個RMQ問題,同時要加點,我們因此考慮ST表或者線段樹.這里用線段樹是核彈打蚊子,沒有意義,我們因此考慮ST表.我們注意到如果加點操作需要改動ST表原來的東西ST表就會炸掉,我們就要考慮更高級的數據結構…

使用yolov8對視頻進行目標檢測

使用 Ultralytics 的 YOLO 模型對視頻進行逐幀目標檢測非常簡單&#xff0c;以下是完整的實現方法&#xff1a; 我們的輸入視頻是這樣的 視頻目標檢測輸入視頻這里是天津市和平區天津大學附近&#xff0c;感興趣的小伙伴來天津玩哈&#xff01;&#xff01; 1. 安裝依賴 確保已…

Edge瀏覽器的自動化點擊系統

Tag_click_openclose_V6 開發與使用注意事項 網頁自動化點擊系統 一個基于Python和CustomTkinter開發的桌面應用程序&#xff0c;通過Selenium實現對Edge瀏覽器的自動化控制。點擊Tag_click_openclose_V6進入Github自取&#xff0c;記得點贊收藏嗷。 功能介紹 連接到已打開…

Python股票數據分析與預測系統 LSTM神經網絡算法 股票價格預測 Tensorflow深度學習 機器學習 Flask框架 東方財富(建議收藏)?

博主介紹&#xff1a;?全網粉絲50W&#xff0c;前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室&#xff0c;專注于計算機相關專業項目實戰6年之久&#xff0c;累計開發項目作品上萬套。憑借豐富的經驗與專業實力&#xff0c;已幫助成千上萬的學生順利畢業&#xff0c;…

英萊科技焊縫跟蹤系統亮相德國埃森焊接展,激光視覺點亮世界舞臺

9月15-19日&#xff0c;每4年一屆的德國埃森焊接與切割展覽會&#xff08;SCHWEISSEN & SCHNEIDEN&#xff09;即將盛大開幕。作為焊接行業最具規模及權威性的盛會之一&#xff0c;英萊科技將攜全新PF系列激光視覺焊縫跟蹤系統驚艷亮相&#xff0c;為全球智能化焊接貢獻中國…

嵌入式基本概念:什么是指令集,微架構,IDE,DFP等等是什么意思,有什么關系???

注&#xff1a;下面是指令集和微框架的分類圖&#xff0c;后面我會以ARM的M4舉例子。 一.什么是指令集 大概的可以看這個視頻 https://www.bilibili.com/video/BV1uXzbYBEy2/?spm_id_from333.1007.top_right_bar_window_custom_collection.content.click&vd_source406ed…

Spring Cloud之服務入口Gateway之自定義過濾器

目錄 過濾器執行順序 自定義過濾器 自定義GatewayFilter 定義GatewayFilter 配置過濾器 啟動服務并訪問 自定義GlobalFilter 定義GlobalFilter 啟動服務并訪問 服務部署 過濾器執行順序 如果?個項?中, 既有GatewayFilter, ?有 GlobalFilter時, 執?的先后順序是什…

MySQL——視圖、儲儲過程、觸發器

目錄 一、視圖 二、存儲過程 三、觸發器 一、視圖 視圖是一種虛擬存在的表。視圖中的數據并不在數據庫中真實存在&#xff0c;行和列數據來自定義視圖的查詢中使用的表&#xff0c;并且是在使用視圖時動態生成的。通俗的講&#xff0c;視圖只保存了查詢的SQL邏輯&#xff0c…

iOS App 卡頓與性能瓶頸排查實戰 如何定位CPU內存GPU幀率問題、優化耗電與網絡延遲(uni-app開發性能優化全流程指南)

在 iOS 應用開發中&#xff0c;卡頓 是用戶最直觀的負面體驗。 一個 App 如果在頁面切換、滾動、后臺運行時頻繁掉幀或發熱&#xff0c;用戶很快就會放棄使用。 對于 uni-app 跨平臺開發者 來說&#xff0c;卡頓問題更為復雜&#xff1a; JS 與原生層橋接增加了 CPU 負載&#…

騰訊開源多模態 RAG:復雜文檔秒變自建知識庫,支持 API 調用

上篇&#xff0c;分享了 小智AI MCP系列的第一篇&#xff1a; 小智 AI 鬧鐘提醒 定時任務&#xff0c;設備端MCP實現 有朋友問&#xff0c;能否接入知識庫 RAG&#xff1f; 讓小智可以根據企業知識庫&#xff0c;回答客戶的疑問~ 當然可以&#xff0c;接入方式同樣是 MC…