1. 程式人生 > 其它 >Django中ORM多對多三種建立方式

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

一:多對多三種建立方式

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.總結:
你需要掌握的是全自動和半自動 為了擴充套件性更高 一般我們都會採用半自動(寫程式碼要給自己留一條後路)