从概念上讲,我想要的是:
class Child:
guardians = models.ManyToManyField(Guardian)
class Guardian:
children = models.ManyToManyField(Child)
Run Code Online (Sandbox Code Playgroud)
申请是为了学校.任何一方(监护人)可以有多个孩子,任何孩子都可以有多个监护人.现在,我不能像在C++中那样在python中转发声明.
什么是最干净,最好的方法呢?我是否需要第三个"关系"类来表示这些联系(这是我正在趋向的)?但在我重新发明轮子之前,我想问一下.看起来这应该很容易......
我不确定我是否理解这个问题.
通过做这个:
class Child:
guardians = models.ManyToManyField('Guardian', related_name='children')
class Guardian:
.... some other fields
# children = models.ManyToManyField(Child) <--- not needed
Run Code Online (Sandbox Code Playgroud)
就像说"孩子可以有很多监护人,监护人可以有很多孩子".您不必在两个模型中声明它.
另外,django在幕后创建了第三个(中间)表.因为这是您在RDBMS中建模ManyToMany关系的方式.
您想要显式创建中间模型的唯一原因是,您必须提供描述特定many2many关系的额外信息.即
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?
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您必须知道,因为您声明了一个显式的中间模型,所以这是在监护人和孩子之间创建关系时要使用的模型.
例如
ChildGuardianMembership.objects.create(child=child_inst, guardian=guardian_inst)
Run Code Online (Sandbox Code Playgroud)
这里描述了在many2many关系上添加额外字段(如上所述)