2010-03-07 32 views
2

假設我有如何不自動取消引用Google App Engine中的db.ReferenceProperty?

class Foo(db.Model): 

    bar = db.ReferenceProperty(Bar) 

foo = Foo.all().get() 

有沒有辦法爲我做foo.bar不以數據存儲正在作出查詢?文檔說foo.bar將是Key的一個實例,因此我期望能夠執行foo.bar.id()並能夠獲得與foo關聯的Barid,但它似乎不能以此方式工作。

PS:我指的是文檔的一部分可以在這裏找到:

http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#ReferenceProperty

和它說的:

「應用程序可以明確地db.get方法()的ReferenceProperty(它是一個Key)的值來測試引用的實體是否存在。「

回答

8

作爲the docs說,

的的ReferenceProperty值可以是 使用,好像它是一個模型實例, 和數據存儲實體將是 取出和模型實例創建 當它被在第一次使用這條路。 未接觸引用屬性不需要 查詢不需要的數據。

所以,只要你不碰它,你就沒問題,但如果你這麼做,如你所示,調用.id(),「數據存儲實體將被提取」,文檔說。更多文檔是here,但它們沒有展示如何在沒有提取的情況下奇蹟般地獲取標識。

我沒有試過,但您可能能夠使用的財產get_value_for_datastore讓我相信「的財產Python的原生價值」確實是一個關鍵 - 其id()方法應該是沒有數據存儲調用取。你嘗試過嗎?

+1

get_value_for_datastore確實是正確的方法 - 特別是ModelClass.property.get_value_for_datastore(entity)。 – 2010-03-07 11:52:37

+0

謝謝,亞歷克斯。我也閱讀了部分文檔。對我來說,做foo.bar.id()會自動進入數據存儲區並不清楚,因爲它說「好像它是一個模型實例」。我認爲可能是這樣的情況,foo.bar返回一個代理,它不會自動去數據存儲,除非它真的需要,如果我做foo.bar.id(),情況不會如此,因爲這些信息是foo本身的一部分。 – allyourcode 2010-03-07 22:56:47

+0

這證明,如果您計劃以某種方式存儲二進制數據,將其分成兩種類型,並且引用包含元數據但不包含二進制數據的元素,這是個好主意,因爲讀取較小的實體會提取較大的元素。 – 2010-03-29 20:27:44