1

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

  • 家长 1
    • 父母 1 的孩子 1
    • 父母 1 的孩子 2
      • 孩子 1 的孩子 2
      • 孩子 2 的孩子 2
  • 家长 2
    • 父母 2 的孩子 1
      • 孩子 1 的孩子 1
    • 父母 2 的孩子 2
      • 孩子 1 的孩子 2

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

所以我们所需要的只是做出正确的识别。换句话说,我们需要为每个项目向我们的模板传递一个参数。让我们将此参数称为 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 值分配的。需要帮助列表,因为模型是 MyModel 类的实例,用于将数据保存在数据存储中并且没有“ident”属性。

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

4

1 回答 1

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
于 2012-12-14T09:50:03.597 回答