我不确定我是否理解这个问题。
通过做这个:
class Child:
guardians = models.ManyToManyField('Guardian', related_name='children')
class Guardian:
.... some other fields
# children = models.ManyToManyField(Child) <--- not needed
就像说“一个孩子可以有很多监护人,一个监护人可以有很多孩子”。您不必在两种模型中都声明它。
无论如何,django 在幕后创建了第三个(中间)表。因为这是在 RDBMS 中建模多对多关系的方式。
您想要显式创建中间模型的唯一原因是当您必须添加描述特定多对多关系的额外信息时。IE
class Child:
guardians = models.ManyToManyField('Guardian',
through='ChildGuardianMembership', related_name='children')
class Guardian:
.... some other fields
class ChildGuardianMembership:
child = models.ForeignKey(Child)
guardian = models.ForeignKey(Guardian)
created_at = models.DateTimeField(auto_now_add=True) # When was this relationship established?
在这种情况下,您必须注意,由于您声明了一个显式中间模型,因此这是在创建监护人和孩子之间的关系时使用的模型。
例如
ChildGuardianMembership.objects.create(child=child_inst, guardian=guardian_inst)
此处描述了在 many2many 关系(如上所述)上添加额外字段