Рекурсивно запрашивает отношения многие ко многим - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь построить генеалогическое дерево в Джанго, и я не могу понять, как ссылаться на детей объекта, и детей детей детей объекта и так далее..

Это моя модель с функцией, которую я использую, чтобы попытаться получить генеалогическое древо:

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 голосов
/ 17 апреля 2019

Если вы строите дерево, когда один из детей указывает на одного из родителей, вы создадите цикл на своем графике, в результате чего ваша функция 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...