最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中多對多關(guān)系三種定義方式

 更新時間:2025年06月27日 08:50:33   作者:Adolf_1993  
Django 中的多對多關(guān)系可以通過三種方式定義,它們在使用便捷性和可擴(kuò)展性上各有差異,下面就來介紹一下如何實現(xiàn),感興趣的可以了解一下

Django 中的多對多關(guān)系(ManyToManyField)可以通過 三種方式定義,它們在使用便捷性和可擴(kuò)展性上各有差異。以下是完整總結(jié) ? 并注明每種方式中哪些方法不可用

? 方式一:默認(rèn)方式(Django 自動創(chuàng)建中間表)

? 特點:

  • 最常用、最方便
  • Django 自動生成中間表
  • 不支持自定義字段

? 示例:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

? 可用方法:

方法可用?說明
.add(obj)?添加關(guān)聯(lián)
.remove(obj)?移除關(guān)聯(lián)
.set([obj1, obj2])?重新設(shè)置關(guān)聯(lián)
.clear()?清除所有關(guān)聯(lián)
.all()?查詢所有關(guān)聯(lián)對象

? 方式二:使用 through 自定義中間表(推薦用于需要額外字段的情況)

? 特點:

  • 中間模型可添加自定義字段(如創(chuàng)建時間、角色等)
  • 更靈活,但略復(fù)雜

? 示例:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(
                            Author, 
                            through="BookAuthor", 
                            through_fields=("book", "author")
)

class BookAuthor(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    added_at = models.DateTimeField(auto_now_add=True)

? 禁用方法:

方法可用?說明
.add(obj)?被禁用,Django 不知道如何填中間表
.remove(obj)?? 同上
.set([obj1, obj2])?? 同上
.clear()?? 同上
.all()?查詢?nèi)匀豢捎?/td>

? 正確操作方式:

使用中間模型手動添加:

BookAuthor.objects.create(book=book, author=author)

? 方式三:完全手動中間表,無 ManyToManyField

? 特點:

  • 不定義 ManyToManyField
  • 所有關(guān)系自己通過中間表查詢管理
  • 最靈活,但也最復(fù)雜,不推薦日常使用

? 示例:

class Author(models.Model):
    name = models.CharField(max_length=100)

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

class BookAuthor(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    added_at = models.DateTimeField(auto_now_add=True)

? 所有 .authors.xxx 都不可用

方法可用?說明
.add() / .remove() / 等?沒有 ManyToManyField 字段
.all()?也不能直接訪問 .authors.all()
查詢方式?需手動通過中間表查詢
# 查詢一本書的所有作者
BookAuthor.objects.filter(book=book).select_related("author")

# 查詢一個作者的所有書
BookAuthor.objects.filter(author=author).select_related("book")

? 總結(jié)對比表

方式是否有中間模型是否能添加中間字段快捷方法(add/remove/set)推薦用途
默認(rèn) ManyToManyField?(Django 自動)?? 可用簡單多對多關(guān)系
ManyToManyField + through??? 被禁用多對多且需附加字段場景
完全手動中間模型??? 全部禁用高度自定義業(yè)務(wù)、底層控制場景

在 Django 中,ManyToManyField 提供了一套專門用于 增刪改查(CRUD) 的方法,用于操作模型之間的多對多關(guān)系。以下是完整的 CRUD 方法總結(jié)(適用于未使用 through 中間模型的情況):

? Django 多對多的 CRUD 方法匯總

假設(shè)模型如下:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

? 1. C:創(chuàng)建關(guān)系(Create)

? 方法一:創(chuàng)建對象后添加關(guān)聯(lián)

book = Book.objects.create(title="Python入門")
author = Author.objects.create(name="張三")

book.authors.add(author)  # 添加關(guān)聯(lián)關(guān)系

? 方法二:一次添加多個對象

book.authors.add(author1, author2, author3)

? 2. R:查詢關(guān)系(Read)

# 查詢某本書的所有作者
book.authors.all()

# 查詢某個作者參與的所有書(反向查詢)
author.book_set.all()

# 如果設(shè)置了 related_name="books",可以用:
author.books.all()

? 3. U:更新關(guān)系(Update)

? 重新設(shè)置關(guān)系(會先清空原有關(guān)系再添加新關(guān)系)

book.authors.set([author1, author2])  # 只保留這兩個作者

? 4. D:刪除關(guān)系(Delete)

? 刪除指定的某個或多個關(guān)系:

book.authors.remove(author1)
book.authors.remove(author1, author2)

? 清除所有關(guān)系:

book.authors.clear()

? 使用限制說明(重要)

方法是否可用條件說明
.add()?不能用于通過 through 自定義中間模型
.remove()?同上
.clear()?同上
.set()?同上
.all()?始終可用

? 如果你在 ManyToManyField 中使用了 through="XXX",上述 .add() 等方法會全部失效,必須手動操作中間模型。

? 5. 示例:完整流程演示

# 添加關(guān)系
book = Book.objects.create(title="FastAPI進(jìn)階")
author1 = Author.objects.create(name="Alice")
author2 = Author.objects.create(name="Bob")
book.authors.add(author1, author2)

# 查詢關(guān)系
for author in book.authors.all():
    print(author.name)

# 更新關(guān)系
book.authors.set([author2])  # 現(xiàn)在只有 Bob

# 刪除單個關(guān)系
book.authors.remove(author2)

# 清空所有關(guān)系
book.authors.clear()

到此這篇關(guān)于Django中多對多關(guān)系三種定義方式的文章就介紹到這了,更多相關(guān)Django 多對多關(guān)系創(chuàng)建內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • tensorflow中的梯度求解及梯度裁剪操作

    tensorflow中的梯度求解及梯度裁剪操作

    這篇文章主要介紹了tensorflow中的梯度求解及梯度裁剪操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python嵌套循環(huán)的使用

    Python嵌套循環(huán)的使用

    本文主要介紹了Python嵌套循環(huán)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2023-02-02
  • python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

    python使用ctypes庫調(diào)用DLL動態(tài)鏈接庫

    這篇文章主要介紹了python如何使用ctypes庫調(diào)用DLL動態(tài)鏈接庫,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • pytorch使用horovod多gpu訓(xùn)練的實現(xiàn)

    pytorch使用horovod多gpu訓(xùn)練的實現(xiàn)

    這篇文章主要介紹了pytorch使用horovod多gpu訓(xùn)練的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • python自動化測試實例解析

    python自動化測試實例解析

    這篇文章主要介紹了python自動化測試實例,并對實例中的注意點進(jìn)行了簡單的分析,需要的朋友可以參考下
    2014-09-09
  • Python Web框架之Django框架文件上傳功能詳解

    Python Web框架之Django框架文件上傳功能詳解

    這篇文章主要介紹了Python Web框架之Django框架文件上傳功能,結(jié)合實例形式詳細(xì)分析了Django框架form表單基于ajax的文件上傳功能詳細(xì)操作技巧,需要的朋友可以參考下
    2019-08-08
  • tornado捕獲和處理404錯誤的方法

    tornado捕獲和處理404錯誤的方法

    這篇文章主要介紹了tornado捕獲和處理404錯誤的方法,方法很簡單,只要覆寫write_error方法就可以,看下面的代碼就明白了
    2014-02-02
  • python:關(guān)于文件加載及處理方式

    python:關(guān)于文件加載及處理方式

    這篇文章主要介紹了python:關(guān)于文件加載及處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Python爬取網(wǎng)頁的所有內(nèi)外鏈的代碼

    Python爬取網(wǎng)頁的所有內(nèi)外鏈的代碼

    這篇文章主要介紹了Python爬取網(wǎng)頁的所有內(nèi)外鏈,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 對python讀寫文件去重、RE、set的使用詳解

    對python讀寫文件去重、RE、set的使用詳解

    今天小編就為大家分享一篇對python讀寫文件去重、RE、set的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論

海伦市| 洛宁县| 延安市| 伊金霍洛旗| 吉林市| 淮滨县| 兴国县| 镇江市| 延庆县| 咸丰县| 砀山县| 新乐市| 罗定市| 满城县| 重庆市| 高清| 轮台县| 昭苏县| 常德市| 车险| 顺昌县| 西安市| 安福县| 白银市| 镇平县| 涪陵区| 巴林右旗| 马尔康县| 观塘区| 石门县| 淅川县| 信阳市| 阳江市| 民丰县| 临夏市| 柏乡县| 清河县| 永年县| 铜山县| 榆树市| 朝阳县|