#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')