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

その方法でオブジェクトに問題なくアクセスできますが、ラップされていないオブジェクトが得られます。

Zope では、オブジェクトは通常トラバーサル経由で取得され、この方法で取得される次のオブジェクトはすべて正しい取得コンテキストにラップされます。このコンテキストは、すべてのオブジェクトにその親オブジェクトが何であるかを伝えます。これは、オブジェクトの絶対 URL とそのセキュリティ コンテキストを計算するために使用されます。

Zope の intid機能を ( five.intid統合層を介して)使用したほうがよいでしょう。これにより、オブジェクトごとに一意の整数 ID が得られ、ユーティリティはオブジェクトだけでなくそのパスも追跡するため、正しいコンテキストでオブジェクトを取得できます。

于 2011-09-02T22:12:34.460 に答える
2

ロードしようとしているオブジェクトのクラスが Python 環境で利用可能であり、oid がルート内のどこかにマウントされた別のデータベースからのものでない限り、これは機能するはずです。

これがうまくいかない理由を説明できますか?

以下が機能するかどうかを確認します (_p_oid == 0 を持つルート オブジェクトを取得する必要があります)。

>>> object = root_obj._p_jar[p64(0)]
于 2010-04-15T00:47:02.887 に答える
1

私の知る限り、それを行う正しいget方法は、接続インスタンスのメソッドを使用することです。

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

編集:の戻り値の型と同じようにオブジェクトのようdbroot._p_jarに見えるので、おそらく両方の方法が同等であると想定できます。間違いなく、アンダースコアがプレフィックスされたメソッドへのアクセスを含まないため、よりクリーンに見えます。ZODB.Connection.Connectiondb.open()conn.get(...)

于 2011-08-01T10:22:40.633 に答える