[Zope-dev] Re: circular referenced persistent objects

Casey Duncan casey at zope.com
Mon Apr 12 09:39:09 EDT 2004


On Sat, 10 Apr 2004 14:11:56 -0500
<zope at netchan.cotse.net> wrote:

> I have the following setup (unrelated lines are omitted):
> 
> class Deliverer(Folder):
>     def manage_afterAdd(self, item, container):
>         if item is self:
>             self.__ac_local_roles__ = dr_localroles(self)
> 
> class dr_localroles(Persistent):
>     def __init__(self, dr):
>         self.dr = dr
> 
> dr_localroles implements a few methods of the dictionary interface, so
> I can always check the effective settings via the Security/local roles
> zmi page. In order to computing roles, dr_localroles requires its
> parent object instance (Deliverer), that's why I store a reference to
> it as an attribute.
> Question:
>  - Is there a way for dr_localroles to refer its parent without
>  holding
> a reference to it or using weak reference?

Yes, use acquisition. Make dr_localroles inherit from
Acquisition.Implicit or Acquisition.Explicit.

>  - Is there an equivalent of sys.getrefcount for ZODB persistent
> objects?

Cycles like this will not be a problem for ZODB. When either object is
deleted it will no longer be reachable from the root, regardless of
cycles between them. When the database is packed, unreachable objects
are removed.
 
> Also a note for the archives:
> I wanted to make sure that if I delete a Deliverer object, it will
> indeed be removed from ZODB. 

Once you pack, yes.

> For this I got the oid of the object,
> deleted it and than tried to get it back via the oid. The trick is,
> that you'll only get a POSKeyError if you pack the database and flush
> the cache. This latter one was not obvious for me.

Such tricks are not necessary and cause your app to rely too much on the
curent implementation of ZODB. Just let the database take care of this
for you.

In any case, there is a (new) persistent weakref class in ZODB 3.3 which
allows you to weakly refer to other persistent objects without causing
them to stay in the database like normal references do.

-Casey




More information about the Zope-Dev mailing list