2012-06-20 5 views
6

私はthis questionとシンプルで明確な答えを読んだことがありますが、答えにネストされたforは考慮されていないため、私の場合は役に立ちません。NDBのバックリファレンスプロパティの代替手段は何ですか?

class SuperCat(ndb.Model): 

class Category(ndb.Model): 
    supercat = ndb.KeyProperty(kind=SuperCat) 

class SubCat(ndb.Model): 
    category = ndb.KeyProperty(kind=Category) 

ハンドラ:テンプレートで

Categories = ndb.gql("SELECT * FROM Category WHERE supercat = :1", supercat_key) 
self.generate('supercat.html', {'Categories': Categories}) 

、古いdb.Modelと後方参照プロパティで、これは十分です:

は何
{{ for Category in Categories }} 
    {{ for SubCat in Category.subcat_set }} # this is the back-reference in action 

、コードを参照してください。そのようなデータ構造を提供するための同様の単純な代替手段ですか?

+0

[Structured Properties](https://developers.google.com/appengine/docs/python/ndb/properties#structured)は良いスタートポイントです。 –

答えて

11

これを体系的に見てみましょう。まず、db->ndb translation guideは次のように与えられたCategoryインスタンスのためのサブカテゴリインスタンスを返すクエリであることを教えてくれる:

subcats_query = SubCategory.query(SubCategory.category == cat.key) 

(私はクラス/モデル用のインスタンス/エンティティとCapWordsため小文字の名前を使用することに注意してください猫がいるので。テンプレートから簡単にアクセスできます何かにこれを有効にするために

for cat in categories: 
    for subcat in SubCat.query(SubCat.category == cat.key): 
     ...blah... 

、のカテゴリに新しいメソッドを定義してみましょう:。エンティティ)

次のようにPythonで、私たちはあなたの二重ループを記述しますがカテゴリークラス:

class Category(ndb.Model): 

    supercat = ndb.KeyProperty(kind=SuperCat) 

    def subcat_set(self): 
     return SubCat.query(SubCat.category == self.key) 

これは方法です。

for cat in categories: 
    for subcat in cat.subcat_set(): 
     ...blah... 

しかし、テンプレートに、あなたは()呼び出し構文を残して(しなければならない)ことができますので、あなたは、あなたが望む結果を得る:Pythonでは、あなたはそれを呼び出す必要があり

{{ for cat in categories }} 
    {{ for subcat in cat.subcat_set }} 
     ...blah... 

が与えます試してみて!

+2

作品!テンプレートではwith()のみです。 without()私はTypeErrorを取得します: 'instancemethod'オブジェクトは反復可能ではありません。 –

+0

どのテンプレートシステムを使用していますか?私はDjangoが呼び出し可能関数を自動呼び出しすると考えました。しかし、おそらくJinja2はありませんか? ()を気に入らないなら、メソッドを@property(小文字の 'p'、Pythonビルトイン)で飾ることができます。 –

関連する問題