方式一: 全自动 (不推荐)
优点: 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 中的字段顺序: 第三张表通过哪个字段查询单表, 就把哪个字段放在前面
方法三的好处: 在项目后续迭代更新中, 如果有需求, 可向关系表中增加字段, 给自己留条后路
来源: http://www.bubuko.com/infodetail-3263978.html