如何在Python中创建一个递归函数来创建一个映射Odoo 8关系字段记录的字典?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Python中创建一个递归函数来创建一个映射Odoo 8关系字段记录的字典?相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个Python函数来映射由Odoo关系字段创建的Web的节点,并返回这样的映射作为字典。 我会试着解释一下。 让我们考虑模型'account.account',及其字段'child_parent_ids'(o2m到同一个类)和'parent_id'(m2o到同一个类,与前一个字段相反)。 如何创建一个字典,其中每个键都是'account.account'的记录,并且每个键的值都是递归的子列表组成的字典,如果这样的记录没有子记录,则为'True'? 例如,让我们考虑一下这个网站:

account
      |
      |_child-1
      |
      |_child-2
      |       |
      |       |_child-21
      |       |_child-22
      |       |_child-23
      |
      |_child-3
      |       |
      |       |_child-31
      |       |_child-32
      |       |        |
      |       |        |_child-321
      |       |        |_child-322
      |       |        |_child-323
      |       |        |_child-324
      |       |
      |       |_child-33
      |       
      |_child-4

我正在寻找的函数应该返回一个这样的字典:

{'account':
    {'child-1': True},
    {'child-2': 
        {'child-21': True},
        {'child-22': True},
        {'child-23': True},
     },
    {'child-3':
        {'child-31': True},
        {'child-32':
            {'child-321': True},
            {'child-322': True},
            {'child-323': True},
            {'child-324': True}
         },
        {'child-33': True},
     }
    {'child-4': True},
 }

我试着创建一个递归函数,如下所示:

@api.multi
def get_tree_dict(self):
    tree_dict = {}
    if self.child_parent_ids:
        for child in child_parent_ids:
            tree_dict[self] = child.get_tree_dict()
        return tree_dict
    else:
        tree_dict[self] = True
        return tree_dict

它似乎不起作用(它没有返回预期的输出,字典停在第一个True值),我找不到原因(请不要对我太难)。 可以请任何人帮助我,通过显示我正在制作的错误,我该如何解决它? 请注意,字典的深度不是先验的,所以我认为该方法应该是递归的(或迭代的)。

答案

因为对于字典,1个键只能有1个值。您不能将多个子项分配给1个父项。

你的代码在这里

for child in child_parent_ids:
    tree_dict[self] = child.get_tree_dict()

将覆盖同一父级的前一个孩子。最后,您只有一个父键有一个父键。

也许你可以考虑使用列表来帮助形成树结构,而不仅仅是字典。然后,您可以将尽可能多的子项追加到列表中。

类似的东西(因为没有最小的工作示例,不知道你的代码是如何工作的,不能保证工作,只考虑它作为一个想法):

expected_dict = 
{'account':
  [
    {'child-1': True},
    {'child-2': [{'child-21': True}, {'child-22': True}, {'child-23': True}]},
    {'child-3': [{'child-31': True}, {'child-32':[{'child-321': True}, {'child-322': True}]},
    {'child-4': True}
  ]
}

def get_tree_dict(self):
    tree_dict = {}
    if self.child_parent_ids:
        tree_dict[self] = []
        for child in child_parent_ids:
            tree_dict[self].append(child.get_tree_dict())
        return tree_dict
    else:
        tree_dict[self] = True
        return tree_dict

以上是关于如何在Python中创建一个递归函数来创建一个映射Odoo 8关系字段记录的字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中创建多个 for 循环列表的递归以获得组合? [复制]

在python中创建另存为函数

如何在 SQL Graph 表中创建递归边?

创建递归路径Python的有效方法

如何在python中创建一个在间隔函数调用上线程化的后台?

使用cppyy时如何在python中创建子类?