如何在Jinja2模板中访问引用对象的属性(Google App Engine)

4 投票
2 回答
5786 浏览
提问于 2025-04-19 22:04

考虑一下在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()就可以了)

撰写回答