多对多的三种方法
多对多表关系的三种创建方法
全自动
就是利用orm自动帮我们创建第三张关系表
优点:
代码不需要你写 非常的方便 还支持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')
半自动
1、代码
class Book(models.Model): name = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
class Author(models.Model): name = models.CharField(max_length=32) # 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')
2、through_fields字段先后顺序
判断的本质:
通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
也可以简化判断:当前表是谁 就把对应的关联字段放前面
3、半自动可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法
需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动