6

私はこの質問とシンプルで明確な答えを読みましたが、答えはネストされたを考慮していないため、私の場合は役に立ちませんfor。コードを見てください:

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

そのようなデータ構造を提供するための同様に単純な代替手段は何ですか?

4

1 に答える 1

11

これを体系的に見てみましょう。まず、db->ndb 変換ガイドによると、特定の Category インスタンスの SubCategory インスタンスを返すクエリは次のようになります。

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

(インスタンス/エンティティには小文字の名前を使用し、クラス/モデルには CapWords を使用することに注意してください。したがって、cat はカテゴリ エンティティです。)

したがって、Python では、二重ループを次のように記述します。

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

これをテンプレートから簡単にアクセスできるものに変えるために、Category クラスに新しいメソッドを定義しましょう。

  class Category(ndb.Model):

    supercat = ndb.KeyProperty(kind=SuperCat)

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

これはメソッドであることに注意してください。Python では、次のように呼び出す必要があります。

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

しかし、テンプレートでは () 呼び出し構文を省略できる (必須) ため、必要なものが得られます。

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

試してみる!

于 2012-06-23T04:33:20.917 に答える