Django多对多循环引用?

时间:2012-06-05 04:02:50

标签: python django

概念上我想要的是:

class Child:
    guardians = models.ManyToManyField(Guardian)

class Guardian:
    children = models.ManyToManyField(Child)

该申请适用于学校。任何一方(监护人)可以有多个孩子,任何孩子都可以有多个监护人。现在,我不能像在C ++中那样在python中转发声明。

最干净,最好的方法是什么?我是否需要第三个“关系”类来表示这些联系(这是我正在趋向的)?但在我重新发明轮子之前,我想问一下。看起来这应该很容易......

2 个答案:

答案 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)

除非明确禁用,否则关系已经是双向的。