14

ReferenceProperty在處理兩個模塊之間的引用時非常有用。福克斯例如:App引擎中的db.ReferenceProperty()與ndb.KeyProperty

class UserProf(db.Model): 
    name = db.StringProperty(required=True) 

class Team(db.Model): 
    manager_name = db.ReferenceProperty(UserProf, collection_name='teams') 
    name = db.StringProperty(required=True) 
  • 得到 'MANAGER_NAME' 與團隊的實例,我們使用team_ins.manager_name。
  • 要獲得由特定用戶實例管理的「團隊」,我們使用user_instance.teams並迭代。

難道看起來不容易理解嗎?

在使用NDB做同樣的事情,我們必須修改

db.ReferenceProperty(UserProf,集合名稱= '團隊') - > ndb.KeyProperty(KIND = UserProf)

  • team_ins。 manager_name.get()會給你經理的名字
  • 要得到所有團隊,由特定用戶的經理,我們要做的

    球隊在Team.query(Team.manager_name == user_ins.key): (格式是這裏不工作)

    print "team name:", team.name 
    

正如你可以看到處理這些類型的場景看起來比分貝NDB更容易和可讀性。

  • 在ndb中刪除ReferenceProperty的原因是什麼?
  • 即使db的查詢user_instance.teams也會像在ndb的for循環中做的那樣做。但是在ndb中,我們明確提到使用for循環。
  • 當我們做user_instance.teams時幕後發生了什麼?

在此先感謝..

回答

26

蒂姆解釋得很好。我們發現一個常見的反模式是使用引用屬性並一次加載它們,因爲符號「entity.property1.property2」沒有說明第一個點導致數據庫「get」操作。所以我們通過強制你編寫「entity.property1.get()。property2」來使它更加明顯,我們通過簡單地說「entity.property1.get_async」,使批量預取變得更容易(沒有Nick博客的複雜解決方案) ()「爲一組實體 - 這排隊一個批處理獲取操作沒有阻塞的結果,當你下一次引用任何這些屬性使用」entity.property1.get()。property2「這不會啓動另一個得到操作,但只是等待該批次完成(並且第二次執行此操作時,批次獲得已完成)。這種進程內存和內存緩存集成也是免費的。

+0

謝謝。 ndb與db相同,但它是顯式的,用戶將會知道get()操作。這種情況沒有性能改進。我已閱讀關於ndb異步,還沒有使用它。 – rajpy

+3

@Tim和Guido,您可以推薦使用類似於http://code.google.com/p/google-app-engine-samples/中的ndb編寫的示例應用程序。以及在基於ndb的應用程序中遵循的最佳實踐。這會有很大的幫助。謝謝。 – rajpy

+0

調用'entity.keyproperty.get()。somevalue1'將在後續的'entity.keyproperty.get()。somevalue2'和'entity.keyproperty.get()。somevalue3'中首次獲取'keyproperty'引用的實體。不會讓數據庫調用? –

7

我不知道答案,爲什麼圭多沒有實行參考屬性。

但是,我發現花了很多時間使用pre_fetch_refprops http://blog.notdot.net/2010/01/ReferenceProperty-prefetching-in-App-Engine(通過獲取所有關鍵字get_value_for_datastore預取所有參考屬性),然後它對關鍵字執行get_multi。

這是非常有效的。

此外,如果所引用的對象不存在,您將在嘗試獲取對象時出現錯誤。

如果你醃製了一個有參考文件的對象,那麼你的酸洗過程比你可能計劃的要多得多。

所以我發現除了一種情況,你有單一的實體,並且你想用.name類型訪問器來獲取被引用的對象,你必須跳過各種各樣的箍環來防止被引用的實體被獲取。

+0

謝謝。希望Guido自己會回答這個問題。:) – rajpy

+0

Tim,感謝您的鏈接。預取在ndb中變得更容易。 – rajpy