如何正确使用ndb KeyProperty?

我有两个模型:

class User(ndb.Model):

email = ndb.StringProperty(required=True)

name = ndb.StringProperty(required=True)

class Post(ndb.Model):

created = ndb.DateTimeProperty(auto_now_add=True)

message = ndb.TextProperty(required=True)

user = ndb.KeyProperty(kind=User)

如果我想遍历Post模型中的一些帖子。我将如何访问用户模型中的“名称”字段?例如:

for post in posts:

print post.message

print post.user.name

所以我猜最后一行是不正确的。我尝试搜索,但无法解决。并补充说明。有没有办法在Jinja2模板中访问该信息?

最后,我要解决这个错误吗?假设有50个帖子。我有1个查询来获取那50个帖子。每次循环时,访问用户模型上的“名称”字段是否会成为附加查询?那么51个查询?如果是这样,最好不要使用KeyProperty,而只在每个帖子中存储用户数据(即使我有更多的数据,例如avatar,user_id等)?

回答:

如果我没记错的话,a KeyProperty会返回a ndb.Key。获得密钥后,很容易获得模型实例(key.get())。因此,在你的示例中,你将:

print post.user.get().name

至于在Jinja模板中访问它-当然,只是这样:

{% for post in posts %} 

{{ post.message }}

{{ post.user.get().name }}

{% endfor %}

是的,这将与你拥有的每个密钥一次与数据存储交互。如果愿意,可以将其分解为一个数据存储交互:

keys = [p.user for p in posts]

users = ndb.get_multi(keys)

user_posts = zip(users, posts)

然后在你的jinja模板中:

{% for user, post in user_posts %}

{{ post.message }}

{{ user.name }}

{% endfor %}

以上是 如何正确使用ndb KeyProperty? 的全部内容, 来源链接: utcz.com/qa/417658.html

回到顶部