在咱們以前建立多對多表的時候,一直用的都是全自動的方式來建立第三張表的。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
總而言之:這個告訴咱們的就是,在射擊項目的時候,必定要給本身留後路,防止後續的迭代更新!!!!!擴展