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)
试试看!
| 归档时间: |
|
| 查看次数: |
2428 次 |
| 最近记录: |