我已阅读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
提供此类数据结构的同样简单的替代方法是什么?
答案 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...
试一试!