创建多对多表关系的三种方式
在我们之前创建多对多表的时候,一直用的都是全自动的方式来创建第三张表的。
1.全自动(推荐使用**)
好处在于 django orm会自动帮你创建第三张关系表
但是它只会帮你创建两个表的关系字段 不会再额外添加字段
虽然方便 但是第三张表的扩展性较差 无法随意的添加额外的字段
class Book(models.Model):
...
authors = models.ManyToManyField(to='Author')
class Author(models.Models):
...
好处坏处都很明显,好处就是方便,坏处就是老板叫你加个字段你就炸了。
2.纯手动(不推荐)
好处在于第三张表可以任意的添加额外的字段
不足之处在于orm查询的时候 很多方法都不支持 查询的时候非常麻烦
class Book(models.Model):
...
class Author(models.Models):
...
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
create_time = models.DateField(auto_now_add=True)
...
这个就不用说了,连django存在的意义都没了,好多方法都不能用。
3.半自动(推荐使用******)
手动建表 但是你会告诉orm 第三张表是你自己建的
orm只需要给我提供方便的查询方法
第三种虽然可以使用orm查询方法
但是不支持使用
add()
set()
remove()
clear()
class Book(models.Model):
...
authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))
class Author(models.Model):
...
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')
create_time = models.DateField(auto_now_add=True)
...
# 1.半自动 一定要加两个额外的参数
through='Book2Author', through_fields=('book','author')
# 2.后面字段的顺序
由第三张表通过哪个字段查询单表 就把哪个字段放前面
半自动也是最推荐使用的,虽然他不支持了那四个方法,但好在那四个方法不难写,和纯手动的比起来完全不算什么,但是要注意的是,第三张表是自己创建的,两个表都要建立一个
ManyToManyField的字段,而且里面都要加上两个参数,一个是through,意思是通过哪张表,也就是第三张表,第二个参数就是 through_fields,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询单表 就把哪个字段放前面。
总而言之:这个告诉我们的就是,在射击项目的时候,一定要给自己留后路,防止后续的迭代更新!!!!!