Django中ORM多對多三種建立方式

2022-10-08 03:54:10 字數 2116 閱讀 2730

一:多對多三種建立方式

1.全自動: 利用orm自動幫我們建立第三張關係表

class book(models.model):

name = models.charfield(max_length=32)

authors = models.manytomanyfield(to='author')

class author(models.model):

name = models.charfield(max_length=32)

優點: **不需要自己寫 非常方便 還支援orm提供操作第三張關係表的方法

不足之處: 第三張關係表的擴充套件性極差(沒辦法額外新增字段)

2.純手動
class book(models.model):

name = models.charfield(max_length=32)

authors = models.manytomanyfield(to='author')

class author(models.model):

name = models.charfield(max_length=32)

class book2author(models.model):

book_id = models.foreignkey(to='book')

author_id = models.foreignkey(to='author')

優點: 第三張表完全取決你自己進行額外的擴充套件

不足之處: 需要寫的**較多,不能再使用orm提供的簡單的方法

不建議使用

3.半自動
class book(models.model):

name = models.charfield(max_length=32)

authors = models.manytomanyfield(to='author',

through='book2author',

through_fields=('book','author'))

class author(models.model):

name = models .charfield(max_length=32)

class book2author(models.model):

book = models.foreignkey(to='book')

author = models.foreignkey(to='author')

半自動:可以使用orm的正反向查詢 但是沒法使用add,set,remove,clear這四個方法

4.半自動全文解析
through : 告訴orm我跟作者是多對多的關係,我是通過我自己寫的表建立關係的 該錶book2author 建立關係

為何使用through='book2author'?

防止第三張表中還有其他字段,所以我們還需要一張表,來告訴第三張表, 書籍跟作者是通過哪些欄位來繫結關係的

through_fields: 告訴orm書籍跟作者是通過book,author欄位來繫結關係的

to = 'author'

讓orm知道書籍跟作者是多對多

through = 'book2author'

並且告訴orm不需要再建立表,自己手動已經建立好了

through_fields

告訴orm書籍跟作者是通過book,author欄位來繫結關係的

5.半自動through_fields=('book','author')的順序
through_fields=('book','author')的順序:

1.順序由當前第三張查詢對應關係的author表通過那個字段

2.通過book,所以book放在第一位,然後第二個字段放在第二位

through_fields欄位先後順序

判斷的本質:

通過第三張表查詢對應的表 需要用到哪個欄位就把哪個欄位放前面

你也可以簡化判斷

當前表是誰 就把對應的關聯欄位放前面

6.總結:
你需要掌握的是全自動和半自動 為了擴充套件性更高 一般我們都會採用半自動(寫**要給自己留一條後路)

Django 40 ORM多對多新增

前提 初始表資料 book表和author表為多對多關係,一本圖書可能有多個作者,乙個作者可能有多本書 新增add 可以為數字 即id 物件 物件列表 book表 author表 book authors表 關係表 from django.shortcuts import render 匯入顯示頁面...

Django 44 ORM多對多刪除

前提 初始表資料 remove 刪除,可以為數字 即id 物件 物件列表 delete篩選後刪除 clear清空 book表 author表 book authors表 關係表 from django.shortcuts import render 匯入顯示頁面的模組 from django.htt...

Django學習 9 ORM多對多操作

建立多對多 方式一 自定義關係表 class host models.model nid models.autofield primary key true hostname models.charfield max length 32,db index true ip models.generic...