2

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

4

3 回答 3

2

这应该可以工作,只要您尝试加载的对象的类在 Python 环境中可用,并且只要您的 oid 不是来自安装在根目录中某处的另一个数据库。

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

查看以下是否有效(它应该获取具有 _p_oid == 0 的根对象):

>>> object = root_obj._p_jar[p64(0)]
于 2010-04-15T00:47:02.887 回答
2

您可以通过这种方式很好地访问该对象,但您会得到一个未包装的对象。

在 Zope 中,对象通常通过遍历检索,并且您以这种方式检索的每个下一个对象都包装在正确的获取上下文中。这个上下文告诉每个对象它的父对象是什么,而这又被用来计算对象的绝对 URL 和它的安全上下文。

你最好使用Zope intid工具(通过它的Five.intid集成层);这为您提供了每个对象的唯一整数 ID,并且该实用程序不仅跟踪对象,还跟踪其路径,因此您可以使用正确的上下文获取对象。

于 2011-09-02T22:12:34.460 回答
1

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

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

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

于 2011-08-01T10:22:40.633 回答