2010-04-06 42 views
2

每個Zope對象都有它自己的唯一ID(_p_oid)。使用Zope對象唯一ID(_p_oid)來訪問對象本身

要將其轉換成整數值:

from Shared.DC.xml.ppml import u64 as decodeObjectId 
oid = decodeObjectId(getattr(<Object instance>, '_p_oid')) 

是否有可能得到對象本身有它_p_oid?

我嘗試這樣做:

from ZODB.utils import p64 
object = <RootObject instance>._p_jar[p64(oid)] 

但現在看來,這是一個錯誤的方式,因爲越來越對象後,我改變不了任何財產和object.absolute_url()返回空字符串。

回答

2

只要您嘗試加載的對象的類在Python環境中可用,並且只要您的oid不是來自安裝在根中某處的另一個數據庫,就應該可以工作。

你能描述一下這種方法不適合你嗎?

看有無下列作品(它應該得到根對象,其中有_p_oid == 0):

>>> object = root_obj._p_jar[p64(0)] 
1

據我所知,做正確的方法是使用get方法連接實例:

>>> db = DB(...) 
>>> conn = db.open() 
>>> obj = conn.get(oid) 

編輯:看來,dbroot._p_jarZODB.Connection.Connection對象一樣的db.open()返回類型也許這可以假設兩種方法是等效的。可以說,conn.get(...)似乎更清潔,因爲它不涉及訪問下劃線前綴的方法。

+0

在'ZODB/utils.py'中有'oid_repr'和'repr_to_oid',它們在調試時處理oids時非常有用。 –

2

你可以很好地訪問該對象,但你得到一個解包對象。

在Zope中,通常通過遍歷檢索對象,並且以這種方式檢索的每個下一個對象都被包裝在正確的採集上下文中。該上下文告訴每個對象它的父對象是什麼,並且這反過來用於計算對象的絕對URL和它的安全上下文。

你會更好的使用Zope intid設施(通過它的five.intid集成層);它爲每個對象提供一個唯一的整數ID,該實用程序不僅跟蹤對象,而且還跟蹤對象的路徑,因此您可以使用正確的上下文返回對象。

+0

是否有某種方法僅使用zope本機庫重新創建這種採集上下文? –

+0

是的,通過重新包裝物體; 'wrap = child ___ of __(parent)'將包裝父項的上下文中的子項,例如'wrapped._aq_parent == parent'。棘手的一點是如何弄清楚正確的父母是什麼。另見http://wiki.zope.org/zope2/Acquisition –