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

Gio*_*oia 6 google-app-engine app-engine-ndb

我已经阅读了这个问题以及简单明了的答案,但它在我的案例中没用,因为答案不考虑嵌套for.请看,代码:

class SuperCat(ndb.Model):

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

class SubCat(ndb.Model):
  category = ndb.KeyProperty(kind=Category)
Run Code Online (Sandbox Code Playgroud)

处理:

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

在模板中,使用旧的db.Model和back-reference属性就足够了:

{{ for Category in Categories }}
  {{ for SubCat in Category.subcat_set }} # this is the back-reference in action
Run Code Online (Sandbox Code Playgroud)

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

Gui*_*sum 11

让我们系统地看一下.首先,db-> ndb转换指南告诉我们返回给定Category实例的SubCategory实例的查询如下:

  subcats_query = SubCategory.query(SubCategory.category == cat.key)
Run Code Online (Sandbox Code Playgroud)

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

所以在Python中,我们将编写双循环,如下所示:

  for cat in categories:
    for subcat in SubCat.query(SubCat.category == cat.key):
      ...blah...
Run Code Online (Sandbox Code Playgroud)

为了将其转换为可以从模板轻松访问的内容,让我们在Category类上定义一个新方法:

  class Category(ndb.Model):

    supercat = ndb.KeyProperty(kind=SuperCat)

    def subcat_set(self):
      return SubCat.query(SubCat.category == self.key)
Run Code Online (Sandbox Code Playgroud)

请注意,这是一种方法; 在Python中,你必须调用它:

  for cat in categories:
    for subcat in cat.subcat_set():
      ...blah...
Run Code Online (Sandbox Code Playgroud)

但是在模板中,您可以(必须)省略()调用语法,以便获得所需内容:

  {{ for cat in categories }}
    {{ for subcat in cat.subcat_set }}
      ...blah...
Run Code Online (Sandbox Code Playgroud)

试试看!

  • 作品!但只能在模板中使用()没有()我得到一个TypeError:'instancemethod'对象是不可迭代的. (2认同)