我有一个代表django中简单树节点的模型:
class Node(models.Model):
name = models.CharField('Name')
parent = models.ForeignKey('self', blank=True, null=True, related_name='children')
我有一个文档,它由一个树形结构组成,用于标签,如下所示:
Level1.1
Level2.1
Level2.2
Level3
Level1.2
当我解析这个文档时,我有以下字符串:
'Level1.1\n\tLevel2.1\n\tLevel2.2\n\t\tLevel3\nLevel1.2'
如何有效地解析此字符串并创建节点?结果应该是:
Node(name='Level1.1'), Node(name='Level2.1', parent=Node(previous node)) etc.
提前致谢!
答案 0 :(得分:1)
使用堆栈跟踪父节点。
document = 'Level1.1\n\tLevel2.1\n\tLevel2.2\n\t\tLevel3\nLevel1.2'
stack = [] # keep track of ancestors ([0] - root, ..., [-1] - parent)
for line in x.splitlines():
name = line.strip()
level = line.count('\t')
while len(stack) > level:
stack.pop()
node = Node(name=name, parent=stack[-1] if stack else None)
node.save()
stack.append(node)