如何设置ndb keyProperty

时间:2013-01-07 08:34:24

标签: python django google-app-engine app-engine-ndb

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

我有一个post实体和一个user实体。如何将user_key上的post设置为user

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

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

3 个答案:

答案 0 :(得分:2)

尝试:

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

答案 1 :(得分: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()

答案 2 :(得分:0)

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