建立多對多表關係的三種方式

建立多對多表關係的三種方式

在咱們以前建立多對多表的時候,一直用的都是全自動的方式來建立第三張表的。django

全自動

1.全自動(推薦使用**)
            好處在於 django orm會自動幫你建立第三張關係表
            可是它只會幫你建立兩個表的關係字段 不會再額外添加字段
            雖然方便 可是第三張表的擴展性較差  沒法隨意的添加額外的字段
            class Book(models.Model):
                ...
                authors = models.ManyToManyField(to='Author')
            
            class Author(models.Models):
                ...

好處壞處都很明顯,好處就是方便,壞處就是老闆叫你加個字段你就炸了。code

純手動

2.純手動(不推薦)
            好處在於第三張表能夠任意的添加額外的字段
            不足之處在於orm查詢的時候  不少方法都不支持    查詢的時候很是麻煩
            class Book(models.Model):
                ...
                
            class Author(models.Models):
                ...
            
            class Book2Author(models.Model):
                book_id = models.ForeignKey(to='Book')
                author_id = models.ForeignKey(to='Author')
                create_time = models.DateField(auto_now_add=True)
                ...

這個就不用說了,連django存在的意義都沒了,好多方法都不能用。orm

半自動

3.半自動(推薦使用******)
            手動建表 可是你會告訴orm 第三張表是你本身建的
            orm只須要給我提供方便的查詢方法
            第三種雖然能夠使用orm查詢方法  
            可是不支持使用
                add()
                set()
                remove()
                clear()
            
            
            
            class Book(models.Model):
                ...
                authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))


            class Author(models.Model):
                ...
                books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))

            class Book2Author(models.Model):
                book = models.ForeignKey(to='Book')
                author = models.ForeignKey(to='Author')
                create_time = models.DateField(auto_now_add=True)
                ...
            # 1.半自動 必定要加兩個額外的參數
                through='Book2Author', through_fields=('book','author')
            # 2.後面字段的順序
                由第三張表經過哪一個字段查詢單表 就把哪一個字段放前面

半自動也是最推薦使用的,雖然他不支持了那四個方法,但好在那四個方法不難寫,和純手動的比起來徹底不算什麼,可是要注意的是,第三張表是本身建立的,兩個表都要創建一個rem

ManyToManyField的字段,並且裏面都要加上兩個參數,一個是through,意思是經過哪張表,也就是第三張表,第二個參數就是 through_fields,要寫一個元組,告訴第三張表,經過這個元組裏的兩個字段知道是那兩張表多對多,第三張表經過哪一個字段查詢單表 就把哪一個字段放前面。class

總而言之:這個告訴咱們的就是,在射擊項目的時候,必定要給本身留後路,防止後續的迭代更新!!!!!擴展

相關文章
相關標籤/搜索