在这种情况下,如何正确使用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)

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

for post in posts:
    print post.message
    print post.user.name

所以我猜最后一行不正确。 我尝试搜索,但无法弄清楚。 除此之外,还要补充一点。 有没有办法在 Jinja2 模板中访问该信息?

最后,我做错了吗? 假设有 50 个帖子。 我有 1 个查询来获取这 50 个帖子。 访问用户模型上的"名称"字段是否是每次循环时的额外查询? 所以 51 个查询?? 如果是这样,是否最好不要使用 KeyProperty 并只存储每个帖子的用户数据(即使我有更多的数据,如头像、user_id等)?

如果我没记错的话,KeyProperty会给你一个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 %}

最新更新