gae / python中的嵌套注释

时间:2012-10-11 18:17:03

标签: python google-cloud-datastore

我是GAE和python的新手。挑战在于使用例如3个标识级别进行嵌套注释。 GAE-datastore为我们工作了一半。它以所需的方式存储和输出嵌套结构。 所以举个例子很简单:

  • 家长1
    • 父母1的孩子1
    • 父母1的孩子2
      • 2岁儿童1
      • 2岁儿童2
  • 家长2
    • 父母2的孩子1
      • 1岁儿童1
    • 父母2的孩子2
      • 2岁儿童1

如果我们将此层次结构保留在数据存储区中(通过在创建实体时使用属性“parent”),我们将能够获取已经按这种方式排序的实体列表:
家长1 父母1的孩子1 父母1的孩子2 2孩子1 2岁儿童2 家长2 父母2的孩子1 孩子1的孩子1 父母2的孩子2 2岁儿童1

所以我们所需要的只是做出正确的认同。换句话说,我们需要将参数传递给每个项目的模板。我们称这个参数为0,1,2。我有解决方案,但我不喜欢它。 我用这种方式计算ident的参数值:

ident_value = len(CURREN_ITEM.key().to_path())/2 - 2

(GAE层次结构路径中的每个级别由2个元素组成。)

因此,在从数据存储区获取模型后,此循环正在执行:

for model in model_list:            
    new_model_list.append(model) # helper list
    ident_value = len(model.key().to_path())/2 - 2 
    if ident_value>3: ident_value = 3 # max ident = 3
    setattr(new_model_list[i], 'ident', ident_value )
    i += 1  

然后new_model_list传递给jinja模板,其中每个项目的类名都是基于model.ident值分配的。 需要帮助程序列表,因为model是MyModel类的实例,用于在数据存储区中保存数据并且没有“ident”属性。

所以问题是:是否有更优雅的方式来做同样的事情?

1 个答案:

答案 0 :(得分:0)

我的解决方案,如果有人需要:

def nest (flow, root_rep_id_list, deep = 0): 
    msglist = []
    nested_comments = []
    deep += 1 

    for rep_id in root_rep_id_list:
        if rep_id in flow:
            msglist.append(flow[rep_id])        

    for msg in msglist: 
        nested_comments.append(Nestedobject (msg, nest(flow, msg.replies, deep) if msg.replies else None, deep))
        logging.error(msg.replies)      
    return nested_comments