Django | ORM创建多对多表关系的三种方式
多对多三种创建方式
全自动:
# 利用orm自动帮我们创建第三张表关系。
class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Authors') # 利用orm自动创建第三张关系表
class Authors(models.Model):
name = models.CharField(max_length=32)
# 优点:
第三张关系表代码不需要自己写,非常的方便,还支持orm提供操作第三张关系表的方法(add,set...)
# 缺点:
第三张关系表的扩展性极差(没有办法额外添加字段)
纯手动:
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')
)
class Author(models.Model):
name = models.CharField(max_length=32)
# books = models.ManyToManyField(to='Book',
# through='Book2Author',
# through_fields=('author','book')
# )
# 多对多表关系外键字段可以创建在任意一张表中:throuth_fields字段先后顺序是:
判断的本质:
通过第三张表查询对应的表,需要用到那个字段就把那个字段放前面
('如果要通过关系表找到Book表,就把book字段放在前面')
简化判断:
当前外键创建在那张表中,就把对应的关联字段放在前面
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
# 半自动可以使用orm正反向查询:但是没法使用add,set,remove,clear这四个方法
# 总结:需要掌握的是全自动和半自动 因为半自动的扩展性更高 一般我们都会采用半自动,
比如:如果我们用全自动创建的多对多的关系表后,需要在关系表中添加新的字段,比如两个关系的绑定时间之类的,那么这时使用全自动就无法实现了,所以这时使用半自动就可以更方便后续的拓展