Рекурсивный запрос отношения «многие ко многим»

#django #python-3.x

#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:

Если вы построите дерево, в котором один из дочерних элементов указывает на одного из родителей, вы создадите цикл в своем графике, в результате чего ваша tree функция будет выполняться бесконечно.

Затем вам нужно избегать добавления a 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')