使用页属性sortIndex遍历树

2024-06-10 21:00:49 发布

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

{1>从一个名为cdm>的结构中检索到一个名为{1}的结构的页面。在

每个页面条目都有一个parentKey属性,即db.SelfReferenceProperty()和一个名为sortIndex的db.IntegerProperty()。在

我获取列表并调用一个方法来遍历该列表,并生成一个嵌套dict作为我的树。我获取整个列表的原因是我想跳过多个查询。在

pages = Pages.gql('ORDER BY sortIndex').fetch(1000)
build_tree(pages)

以及构建树:

^{pr2}$

问题是列表get被重新排列了,而且没有遵循det ORDER BY。我认为这是因为每一页都被放在列表中,当找到合适的家长。但即使是第一级(具有parentKey == None的页面)get也以错误的顺序返回。在

我尝试过在tree[str(I)+'\'+str(key)]上使用循环计数器设置前缀,但仍然没有按正确的顺序返回。在

所以问题是如何让它们按正确的顺序排列?在

编辑[已解决]:

见下文


Tags: tree列表dbgetby顺序order条目
1条回答
网友
1楼 · 发布于 2024-06-10 21:00:49

为了保持作为参数发送的列表的顺序来构建树,我移到了一个不同的角度。我用list代替,顺序保持不变:

def build_tree(nodes, *args):
    # create empty tree to fill
    t = {}
    # First group all pages w/ same parent
    for node in nodes:
        if node.parentKey is None:
            key = 'root'
        else:
            key = node.parentKey.key()

        if not t.has_key(key):
            t[key] = []

        t[key].append({ 'page' : node, 'children' : []})

    pageTree = t['root']
    # Iterate over there
    build_page_tree(pageTree, t)

    return pageTree

def build_page_tree(pageTree, nodes):
    #Loop over selected list
    for parent, node in nodes.iteritems():
        # We don't need to loop over first level node
        if parent is not 'root':
            # Loop over current level in page tree
            for item in pageTree:
                # Match keys
                if item['page'].key() == parent:
                    # Save node as child
                    item['children'] = node
                    # Only need to loop over childs if they are present
                    build_page_tree(item['children'], nodes)

相关问题 更多 >