多对多的三种创建方式
方法一:全自动
——利用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提供操作第三张关系表的方法...
不足之处:第三张关系表的扩展性极差(没有办法额外添加字段)...
方法二:纯手动
class Book(models.Model): name = models.CharField(max_length=32) 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提供的简单的方法
—— 不建议使用
方法三:半自动
class Book(models.Model): name = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book', 'author') ) """ through_fields字段先后顺序: 判断的本质: 通过第三张表查询对应的表,需要用到哪个字段就把哪个字段放前面 简化判断: 当前表是谁,就把对应的关联字段放前面 """ 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的正反向查询,但是没法使用add,set,remove,clear这四个方法
总结:需要掌握的是全自动和半自动,为了扩展性更高,一般我们都会使用半自动