[Zope] Save references in a list as object attribut

Tres Seaver tseaver at palladion.com
Sun Jan 31 18:01:03 EST 2010


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Vladislav Vorobiev wrote:
> Thierry Florac wrote:
>> Le vendredi 29 janvier 2010,
>>   Vladislav Vorobiev <vavvav at mykniga.de> a écrit :
>> ======================================================================
>> ...
>>
>>   
>>> Thierry thank you  for answer but it doesn't help.
>>>
>>> I implement all what you sad. I tried with normal “list” and than 
>>> swiched to “PersistentList”
>>>
>>> code looks like that:
>>>
>>> from persistent.list import PersistentList
>>> import transaction
>>>
>>> <snip>
>>>
>>> myList=PersistentList([self.context.pfad, 'object])           
>>> myList[0] = PersistentList([self.context.pfad, 'object])[0]  #hope I 
>>> anderstud you right
>>>
>>> ob.refList= myList 
>>> ob._p_changed = True
>>> ob.refList._p_changed = True 
>>> self.context._setObject(id, ob)
>>>
>>> After add I call again:
>>>
>>> ob._p_changed = True
>>> ob.refList._p_changed = True 
>>> transaction.commit()
>>>
>>> I see the commitet trunsactions in ZMI
>>>
>>> The same problem. After restart ist the Attribut not in context.
>>>
>>> For example return's
>>>
>>> Before restart: ***1
>>> ob.refList[0].objectValues()[0].absolute_url()
>>> /pfad/object/FirstObjectOfReferencedObject
>>>
>>> After restart only the id of the object:
>>> ob.refList[0].objectValues()[0].absolute_url()
>>> FirstObjectOfReferencedObject
>>>
>>> Here is a place for an other question:
>>>
>>> Normaly  self.absolute_url() returns url with hostname,  
>>> (http://localhost/bla/bla)
>>> but already befor restart I get without http://localhost/... see ***1
>>>
>>> It seem's that I forgot something.  I would be glad to if somebody 
>>> explain me this problem.
>>>     
>> ======================================================================
>>
>> In fact I'm not really sure to understand your data structure and it's
>> goals...
>> Could you explain me what you want to do ??
>>
>> Thierry
>>   
> I want to set some references from object to another object through. I try to 
> explain this with example classes.
> 
> Example with two classes:
> 
> #Create classes
>  >>>class School:
>  >>>   pass
> 
>  >>>class People:
>  >>>   pass
> 
> #Create objects
>  >>>p=People()
> 
>  >>>s0=School()
>  >>>s0.name="Konrad School"
> 
>  >>>s1=School
>  >>>s1.name="Leopold School"
> 
> Now I set the referece
> 
>  >>>p.school1=s0
>  >>>p.school2=s1
> 
> Now I can access through the attribut to s0 and s1 objects:
> 
> p.school1.name
> “Konrad School“
> 
> This construction works persistent without problems.
> 
> The idea is to put the references in a list.
> 
>  >>>p.schools=[s0,s1]
> 
> to access them
> 
>  >>>p.schools[0].name
> “Konrad School“
> 
>  >>>s1.name="Leo School"
>  >>>p.schools[1].name
> “Leo School“
> 
>  >>>type(p.schools[1])
> <type 'classobj'>
> 
> It works in zope without restart. If the server was restartet I get some 
> unwanted results. See my previews posts.
> The same effects I get with PersistentLists...
> 
> I hope it is more  understandable.

You can't expect to use a simple list as an attribute of a persistent
object without taking special precautions.  Either you have methods
which mutate the list, and then set the '_p_changed' attribute to 1:

  def addSchool(self, school):
      self.schools.append(school)
      self._p_changed = 1

or re-assign the list attribute:

  def addSchool(self, school):
      schools = self.schools
      schools.append(school)
      self.schools = schools

You shoule be able to use a PersistentList instead of a "plain" Python
list to avoid the need for one of those two problems:

   from persistent.list import PersistentList
   ...
   class Person:
       def __init__(self):
           self.schools = PersistentList()


Tres.
- --
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAktmC68ACgkQ+gerLs4ltQ7YwACgmVuBDXwBykODaN4oCavOYRAD
E3MAn1QRQmlSWSnyFvahj8N9rk4+6eXJ
=Vz6h
-----END PGP SIGNATURE-----



More information about the Zope mailing list