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 回答