如何在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关系字段记录的字典?的主要内容,如果未能解决你的问题,请参考以下文章