多对多关系表的三种创建方式
全自动
在我们之前创建多对多表的时候,一直用的都是全自动的方式来创建第三张关系表的
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 创建多对多关系字段
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
好处:
- 在于 django orm会自动帮你创建第三张关系表
- 还内置了操作第三张表的方法:add set remove clear
不足:
- 但是它只会帮你创建两个表的关系字段 不会再额外添加字段
- 虽然方便 但是第三张表的扩展性较差 无法随意的添加额外的字段
纯手写(不推荐)
class Book(models.Model):
title = models.CharField(max_length=32)
class Authors(models.Model):
name = models.CharField(max_length=32)
class Book2Authors(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Authors')
# 可以添加任意字段
create_time = models.DateField(auto_now_add=True)
好处:
- 可以在第三张表添加任意字段
不足:
- 纯手写比较麻烦, 没有orm查询的方法
半自动(推荐使用)
class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Authors', through='Book2Authors', through_fields=("book", "authors"))
# through 记录与哪张表的关系表,through_field来指定 哪几个外键字段
class Authors(models.Model):
name = models.CharField(max_length=32)
class Book2Authors(models.Model):
book = models.ForeignKey(to='Book')
authors = models.ForeignKey(to='Authors')
# 可以扩展任意字段
- 当ManyToManyField只有一个参数to的情况下,orm会自动创建第三张表,如果加了through和through_fields,那么orm就不会自动帮你创建第三张表,但是它会在内部帮你维护关系,让你能够继续使用orm的跨表查询方法。
- through参数,自己指定第三张表
- through_fields参数,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询 就把哪个字段放前面。