概念上我想要的是:
class Child:
guardians = models.ManyToManyField(Guardian)
class Guardian:
children = models.ManyToManyField(Child)
该申请适用于学校。任何一方(监护人)可以有多个孩子,任何孩子都可以有多个监护人。现在,我不能像在C ++中那样在python中转发声明。
最干净,最好的方法是什么?我是否需要第三个“关系”类来表示这些联系(这是我正在趋向的)?但在我重新发明轮子之前,我想问一下。看起来这应该很容易......
答案 0 :(得分:6)
我不确定我是否理解这个问题。
通过这样做:
class Child:
guardians = models.ManyToManyField('Guardian', related_name='children')
class Guardian:
.... some other fields
# children = models.ManyToManyField(Child) <--- not needed
就像说“孩子可以有很多监护人,监护人可以有很多孩子”。您 不必在两个模型中声明它。
另外,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?
在这种情况下,您必须知道,因为您声明了一个显式的中间模型, 这是在监护人和孩子之间建立关系时使用的模型。
e.g。
ChildGuardianMembership.objects.create(child=child_inst, guardian=guardian_inst)
在many {3}}
中描述了在many2many关系上添加额外字段(如上所述)答案 1 :(得分:0)
除非明确禁用,否则关系已经是双向的。