NDB中反向引用属性的替代方法是什么?

时间:2012-06-20 15:24:26

标签: google-app-engine app-engine-ndb

我已阅读this question以及简单明了的答案但在我的案例中没有用,因为答案不考虑嵌套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和back-reference属性就足够了:

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

提供此类数据结构的同样简单的替代方法是什么?

1 个答案:

答案 0 :(得分:11)

让我们系统地看一下。首先,db->ndb translation guide告诉我们返回给定Category实例的SubCategory实例的查询如下:

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

(注意我对实例/实体使用小写名称,对类/模型使用CapWords。所以cat是一个Category实体。)

所以在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...

试一试!