2013-01-07 23 views
3

我在理解Google App Engine NDB中实体和按键的工作方式时遇到了一些问题。如何设置ndb keyProperty

我有一个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中设置关联?
+0

看看这里。这帮了我很多 http://stackoverflow.com/questions/11711077/how-to-structure-movies-database-and-user-choices –

回答

2

尝试:

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

我以为我试过这个。但是我可能已经尝试过了,而没有先取得查询。理智恢复了,谢谢。 – mehulkar

0
  1. 验证洗牌的作品在这种情况下,User.query()返回一个国际热核实验堆,而不是一个列表。 (你可以将其转换为使用洗牌(名单[X在用户X])。小心,这个名单可以looong。
  2. NDB有一些非常有线的行为有时,所以ID建议你不要储存的NDB密钥,但其连续字符串,这也是ext.db兼容:post.user_key =洗牌([在用户x对于X]).key.urlsafe()
  3. 你可以使用KeyProperty消协如果你需要一个更精细。在你的关系-graned控制,就必须自己实现这些功能。 见https://developers.google.com/appengine/docs/python/ndb/properties#structured
+0

我也应该发布我的课程。我*我*使用KeyProperty来定义user_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()