1

私はGAEとPythonの初心者です。課題は、たとえば3レベルのIDでネストされたコメントを作成することです。GAE-データストアは私たちのために半分の仕事をします。ネストされた構造を必要な方法で格納および出力します。したがって、例を非常に単純にします。

  • 親1
    • 親1の子1
    • 親1の子2
      • 子2の子1
      • 子2の子2
  • 親2
    • 親2の子1
      • 子1の子1
    • 親2の子2
      • 子2の子1

この階層をデータストアに保持すると(エンティティの作成時に属性「parent」を適切に使用することにより)、次のように既に並べ替えられたエンティティのリストをフェッチできます。
親1親1
の子1親1の
子2
子1の子1
子2の子2
親2親 の子12子の子1子1の
子 2親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値に基づいて各アイテムのクラス名が割り当てられます。モデルはデータストアにデータを保存するために使用される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 に答える