方式一:全自動(不推薦)
- 優點:django orm會自動創建第三張表
- 缺點:只會創建兩個表的關系字段,不會再額外添加字段,可擴展性差
class Book(models.Model):
# ...
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
# ...
pass
方式二:純手動(不推薦)
- 優點:第三張表可以根據自己的要求隨意添加額外的字段
- 缺點:orm在查詢的時候,很多方法不支持,查詢非常麻煩
class Book(models.Model):
# ...
pass
class Author(models.Model):
# ...
pass
class Book_Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
# ...
pass
方式三:半自動
- 優點:手動建表,但要告訴orm第三張表是自己建的,orm只需要提供查詢方法
- 缺點:雖然可以使用orm的查詢方法,但不支持使用add(), set(), remove(), clear()
class Book(models.Model):
# ...
authors = models.ManyToManyField(to='Author', through='Book_Author', through_fields=('book', 'author'))
class Author(models.Model):
# ...
books = models.ManyToManyField(to='Book', through='Book_Author', through_fields=('author', 'book'))
class Book_Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
# ....
- 說明:
- 半自動在創建外鍵的時候,要添加兩個參數,through='關系表名‘和through_fiedls=('此表在關系表中字段名‘, '關聯表在關系表中的字段名')
- through_fiedls中的字段順序:第三張表通過哪個字段查詢單表,就把哪個字段放在前面
- 方法三的好處:在項目后續迭代更新中,如果有需求,可向關系表中增加字段,給自己留條后路