2013-01-07 51 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()