在深度未知的查询集列表上递归

2024-10-03 13:18:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要能够在组织结构图类型的情况下创建多个节点。这些需求要求一个“子”节点能够有多个父节点,因此像mptttreebeard这样的现有解决方案不幸出局

这些要求还指出,我应该能够访问任何级别的节点,并能够基于其子节点进行业务处理

以下是我的尝试:

class Division(models.Model):

    name = models.CharField(
        max_length=250,
    )
    children_set = models.ManyToManyField(
        to='organisations.Division',
        related_name='parent_set',
    )

    def _flatten_children(self, el):
        for item in el.children_set.all():
            if bool(item.children_set.count()):
                yield from self._flatten_children(item)
            else:
                yield item

    def all_children(self):
        return list(self._flatten_children(self))

    def add_child(self, child):
        self.children_set.add(child)

打这个电话时,我似乎只听到了“最后一个”孩子的询问。任何帮助都将不胜感激

# test setup
instance = DivisionFactory()
child1 = DivisionFactory()
child2 = DivisionFactory()
child3 = DivisionFactory()
child4 = DivisionFactory()

instance.add_child(child1)
child1.add_child(child2)
child2.add_child(child3)
child2.add_child(child4)

输出:

In [19]: instance.all_children()
Out[19]: [<Division: Officia dolores illo.>, <Division: Vitae sapiente numquam.>]

请注意,仅返回了child2的两个子节点,并且child1child2都未包含在返回的列表中


Tags: selfaddchild节点modelsdefallitem
1条回答
网友
1楼 · 发布于 2024-10-03 13:18:03

当前代码只生成没有子项的项。你需要让他们都屈服(包括自己)

def _flatten_children(self, el):
    for item in el.children_set.all():
        if bool(item.children_set.count()):
            yield from self._flatten_children(item)
        yield item  # <    # children first

def _flatten_children(self, el):
    for item in el.children_set.all():
        yield item  # <    # parents first
        if bool(item.children_set.count()):
            yield from self._flatten_children(item)

相关问题 更多 >