使用Zope对象唯一id(_p_oid)来访问对象本身

时间:2010-04-06 09:37:03

标签: zope zodb

每个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()返回空字符串。

3 个答案:

答案 0 :(得分:2)

这应该可行,只要您尝试加载的对象的类在Python环境中可用,并且只要您的oid不是来自安装在根目录中的其他数据库。

你能描述一下这对你不起作用的方式吗?

查看以下内容是否有效(它应该获取根对象,其中_p_oid == 0):

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

答案 1 :(得分:2)

答案 2 :(得分:1)

据我所知,正确的方法是使用连接实例的get方法:

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

编辑:似乎dbroot._p_jar是一个ZODB.Connection.Connection对象,就像db.open()的返回类型一样,所以也许可以假设两种方式都是等价的。可以说,conn.get(...)似乎更清晰,因为它不涉及访问下划线前缀方法。