3

我在理解实体和键在 Google App Engine NDB 中的工作方式时遇到了一些麻烦。

我有一个post实体和一个user实体。如何设置user_key为?postuser

在交互式控制台中,到目前为止我有这个:

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 中设置关联?
4

3 回答 3

2

尝试:

post.user_key = shuffle(users)[0].key
于 2013-01-07T08:38:46.753 回答
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()
于 2013-01-07T11:18:10.397 回答
0
  1. 验证 shuffle 在这种情况下是否有效,因为 User.query() 返回的是一个迭代器,而不是一个列表。(您可以使用 shuffle([ x for x in users ] )将其转换为列表。请注意,此列表可能很长。
  2. NDB 有时会有一些非常有线的行为,所以我建议你不要存储 NDB-Key,但它的序列化字符串也与 ext.db 兼容:post.user_key = shuffle( [ x for x in users ] ).key。网址安全()
  3. 您可以使用 KeyProperty 进行关联。如果您需要对关系进行更精细的控制,则必须自己实现它们。请参阅https://developers.google.com/appengine/docs/python/ndb/properties#structured
于 2013-01-07T09:35:13.200 回答