2

我試圖圍繞什麼似乎是一個非常簡單的用例,但我似乎失敗悲慘。練習的目標是查找一組用於在高複製數據存儲中使用Google帳戶用戶名登錄並且非常一致的記錄。NDB使用用戶API來組成一個實體組

我的數據是這樣的:

class Account(ndb.Model): 
    owner = ndb.UserProperty() 
    name = ndb.StringProperty() 

class Content(ndb.Model): 
    content = ndb.StringProperty() 

當我第一次創建帳戶,我只是做到以下幾點:

現在
current_user = users.get_current_user() 
new_account = Account(owner=current_user, name='Some Name') 
new_account.put() 

創建內容:

new_content = Content(parent=new_account.key, content='Some Content') 
new_content.put() 

當用戶登錄後,我只能通過UserProperty進行查詢,但我似乎無法將用戶設置爲實體組的父級,那麼如何確保我始終可以通過登錄用戶查找帳戶並保持一致?

一旦我有了賬戶,祖先查詢過程將確保內容檢索的一致性,但是我堅持根據用戶計算出祖先。

+0

要展開什麼尼克提出了一下,我實際上有一個映射實體將前進將用戶標識映射到帳戶密鑰。通過這種方式,我可以爲一個帳戶提供多個用戶,但仍然使用get()來檢索該帳戶。 – Sologoub 2012-04-24 17:19:51

+0

該文檔還建議不要存儲UserProperty,因爲如果用戶更改其電子郵件地址,它可能會變得不一致:https://developers.google.com/appengine/docs/python/users/userobjects – Spycho 2013-08-24 10:41:53

回答

5

最簡單和最好的方法是使用鍵名稱。在這種情況下,您的帳戶實體的密鑰名稱應該是用戶的ID。你可以這樣創建帳戶:

new_account = Account(owner=current_user, id=current_user.user_id(), name='Some Name') 

你可以看看他們是這樣的:

existing_account = Account.get_by_id(current_user.user_id()) 
+0

謝謝,尼克!這正是我所期待的。猜猜我錯過了它的文檔。 – Sologoub 2012-04-23 04:02:53

0

我不確定爲什麼你要這樣做,但你也必須爲Account創建一個父實體,以便你可以用祖先對它進行查詢。

+0

什麼?不,你沒有。 – 2012-04-23 02:38:51

+0

哦,天哪。我認爲他想爲每個用戶創建多個帳戶實體。如果你只是想在查詢賬戶實體時確保一致性,那麼@ NickJohnson的答案就是要走的路。 :) – Albert 2012-04-23 03:01:09