如何在Jinja2模板中访问引用对象的属性(Google App Engine)
考虑一下在Google App Engine中的数据模型
class A(ndb.Model):
name = ndb.StringProperty()
b = ndb.KeyProperty(Kind='B')
class B(ndb.Model):
name = StringProperty()
现在假设在一个Python的Http请求处理器中,我执行了这个查询
entities = A.query().fetch(200)
然后我把实体作为模板的值传递给一个Jinja2模板
在模板中,我像这样遍历A对象
{%for a in entities%}
{{a.name}}
{% endfor %}
问题是:我怎么能在Jinja2模板中访问A对象引用的B对象的属性呢?比如说像这样 {{a.b.name}}
2 个回答
1
这是一个使用 ndb 异步 API 的情况,可能会很有用...
@ndb.tasklet
def get_b_instances_from_a_instances(a_instance):
b_instance = yield a_instance.b.get_async()
raise ndb.Return((a_instance, b_instance))
entities = A.query().map(get_b_instances_from_a_instances, limit=200)
现在你的 entities
将会是一个包含2个元素的元组列表,每个元组里都有一个 A
的实例和它对应的 B
的实例。
3
你手里有这个实体的钥匙(b),所以你可以直接获取它:
{% set b_entity = a.b.get() %}
{{ b_entity.name }}
(这里用到set
是为了防止实体里有其他属性。这样你只需要调用一次get()
就可以了)