递归查询多对多关系

时间:2019-04-17 14:08:41

标签: django python-3.x

我正在尝试在Django中建立家谱,但我不知道如何引用对象的子代以及对象的子代的子代,依此类推。

这是我的模型,具有要用来获取家谱的功能:

class Member(models.Model):
    referrals = models.ManyToManyField("self", symmetrical=False)

    def tree(self):
        refs = {}
        for ref in self.referrals.all():
            refs[ref] = ref.tree()

        return refs

这似乎可行,但是,如果孩子们也有孩子,那么它会显示以下内容:

maximum recursion depth exceeded while calling a Python object

理想情况下,我希望树函数返回一个作为嵌套列表的字符串对象,因此我可以将结果放在模板中,如下所示:

<ul>
    <li>Member A</li>
    <li>Member B
        <ul>
            <li>Member BA</li>
             <li>Member BB</li>
        </ul>
   </li>
   <li>Member C</li>
</ul>

将感谢您的任何建议,谢谢

1 个答案:

答案 0 :(得分:0)

如果您构建的树中有一个孩子指向父母之一,则您将在图形中创建一个循环,从而使tree函数无限运行。

然后,您必须避免向要添加的成员添加以某种方式具有父母关系的referral

此外,为了清楚起见,我建议您命名反向关系:

# Add related name in order to access parents from a member
# like this:
# member.parents instead of members.referrals_set
referrals = models.ManyToManyField("self", symmetrical=False, related_name='parents')