如何设置ndb的keyProperty

3

我对Google App Engine NDB中实体和键的工作方式有些困惑。

我有一个名为post的实体和一个名为user的实体。如何将useruser_key设置到post上?

在交互式控制台中,我目前有:

from google.appengine.ext import ndb
from app.lib.posts import Post
from app.lib.users import User
from random import shuffle

users = User.query()
posts = Post.query().fetch()

for post in posts:
  post.user_key = shuffle(users)[0]
  post.put()

我只是想为开发设置一些种子数据。我知道这可能不是设置事物的理想方式,但我的第一个问题是:

  1. 如何从实体获取密钥(文档中描述了相反的情况)
  2. 如何在ndb中设置关联?

看这里。这对我帮助很大。 https://dev59.com/cmbWa4cB1Zd3GeqPZKs9 - Jimmy Kane
3个回答

2

尝试:

post.user_key = shuffle(users)[0].key

我以为我试过了。但是我可能在没有先获取查询的情况下尝试了它。理智恢复,谢谢。 - mehulkar

2
也许这可以帮助你理解NDB。我和你一样也有同样的疑问。
class Person(ndb.Expando):
    pass

class Favourite(ndb.Expando):       
    pass

class Picture(ndb.Expando):
    pass

person  = Person()
person.put()
picture = Picture()
picture.put()
fav = Favourite(parent=person.key,
        person=person.key,
        picture=picture.key
        )
fav.put()

0
  1. 验证洗牌在这种情况下是否有效,因为User.query()返回的是一个iter而不是列表。 (您可以使用shuffle([x for x in users])将其转换为列表。请注意,此列表可能很长。)
  2. NDB有时会出现一些非常奇怪的行为,因此我建议您不要存储NDB-Key,而是存储其序列化字符串,该字符串也与ext.db兼容:post.user_key = shuffle([x for x in users]).key.urlsafe()
  3. 您可以使用KeyProperty进行关联。如果您需要更精细的控制关系,则必须自己实现它们。 请参见https://developers.google.com/appengine/docs/python/ndb/properties#structured

我也应该发布我的类。我正在使用KeyProperty来定义user_key。然而,关联对我来说仍然有些棘手。 - mehulkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接