3

从概念上讲,我想要的是:

class Child:
    guardians = models.ManyToManyField(Guardian)

class Guardian:
    children = models.ManyToManyField(Child)

申请是针对学校的。任何一位父母(监护人)都可以有多个孩子,任何孩子都可以有多个监护人。现在,我不能像在 C++ 中那样在 python 中转发声明。

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

4

2 回答 2

6

我不确定我是否理解这个问题。

通过做这个:

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 关系(如上所述)上添加额外字段

于 2012-06-05T09:36:53.130 回答
0

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

于 2012-06-05T04:05:40.777 回答