through : 指定自己写好的第三张表,我们可以给第三张表添加字段了(告诉Django不用建第三张表了,我们都给他配好了)
class Book(models.Model):
name=models.CharField(max_length=20)
authors=models.ManyToMany('Author',through='Score') class Author(models.Model):
name=models.CharField(max_length=20) class Score(models.Model):
book=models.ForeignKey('Book')
author=models.ForeignKey('Author')
socre=models.IntegerField()
如果只写manytomany,那么第三张是Django替我们建的,可以通过book.authors字段进行一系列操作(add(增),all(查),set(重置),remove(删除)),但是此时没法给第三张表加其他我们需要的字段,
而如果不写,ManyToMany字段,那么我们可以通过Score来执行一些操作,但是此时book和author表已经没有直接的联系了,查询起来很繁琐
有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便业务,添加需要的字段
db_constraint :
db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一半公司都用false,这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)
limit_choices_to
限制关联字段的对象范围
related_name
反向查询字段可以不用 表名小写,可以改名了
db_table
第三张表的名字