在这种情况下如何正确使用ndb KeyProperty?

Tyl*_*erW 3 python google-app-engine flask

我有两个型号:

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)
Run Code Online (Sandbox Code Playgroud)

如果我想循环Post模型中的一些帖子.我如何访问用户模型中的"名称"字段?例如:

for post in posts:
    print post.message
    print post.user.name
Run Code Online (Sandbox Code Playgroud)

所以我猜测最后一行不正确.我试着搜索,但无法理解.并补充说.有没有办法在Jinja2模板中访问该信息?

最后,我是不是错了?假设有50个帖子.我有1个查询来获得这50个帖子.访问用户模型上的"名称"字段是否会在每次循环时成为附加查询?那51个查询?如果是这样,最好不使用KeyProperty并且只在每个帖子中存储用户数据(即使我有更多数据,如avatar,user_id等)?

mgi*_*son 6

如果我没记错的话,我KeyProperty会给你一个回报ndb.Key.获得密钥后,很容易获得模型实例(key.get()).所以,在你的例子中,你会:

print post.user.get().name
Run Code Online (Sandbox Code Playgroud)

至于在jinja模板中访问它 - 当然,它只是类似于:

{% for post in posts %} 
{{ post.message }}
{{ post.user.get().name }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

keys = [p.user for p in posts]
users = ndb.get_multi(keys)
user_posts = zip(users, posts)
Run Code Online (Sandbox Code Playgroud)

然后在你的jinja模板中:

{% for user, post in user_posts %}
{{ post.message }}
{{ user.name }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)