多对多关系表的三种创建方式

全自动

在我们之前创建多对多表的时候,一直用的都是全自动的方式来创建第三张关系表的

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参数,要写一个元组,告诉第三张表,通过这个元组里的两个字段知道是那两张表多对多,第三张表通过哪个字段查询 就把哪个字段放前面。
12-22 15:37