从概念上讲,我想要的是:
class Child:
guardians = models.ManyToManyField(Guardian)
class Guardian:
children = models.ManyToManyField(Child)
申请是为了一所学校。任何一个家长(监护人)都可以有多个孩子,任何一个孩子都可以有多个监护人。现在,我不能像在C++中那样在Python中向前声明。
做这件事最干净最好的方法是什么?我是否需要第三个“关系”类来表示这些关系(这正是我想要的)?但在我重新发明轮子之前我想问问。看起来这应该很容易。。。
最佳答案
我不确定我是否理解这个问题。
这样做:
class Child:
guardians = models.ManyToManyField('Guardian', related_name='children')
class Guardian:
.... some other fields
# children = models.ManyToManyField(Child) <--- not needed
就像说“一个孩子可以有很多监护人,一个监护人可以有很多孩子”。你
不必在两个模型中都声明它。
另外,django在幕后创建了第三个(中间)表。因为
这就是在RDBMS中建模多个关系的方法。
您想要显式创建中间模型的唯一原因是
必须添加额外的信息来描述特定的人与人之间的关系。
即
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)
在许多关系(如上所述)上添加额外字段here
关于python - Django多对多循环引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10891396/