每个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()返回空字符串。
答案 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(...)
似乎更清晰,因为它不涉及访问下划线前缀方法。