[Zope] Save references in a list as object attribut

Vladislav Vorobiev vavvav at mykniga.de
Fri Jan 29 10:23:03 EST 2010


Thierry Florac wrote:
> Le vendredi 29 janvier 2010,
>   Vladislav Vorobiev <vavvav at mykniga.de> a écrit :
> ======================================================================
>   
>> I try to save references to objects as attribute in a list.
>>
>> object.refList=getattr([self.
>> context.pfad, 'object'],
>> [self.context.pfad, 'object1'])
>>
>> After adding and transaction commit I can get my linked objects with
>> all attributes and methods
>>
>> myObject.refList
>> [<myType at object>]
>>
>> myObject.refList[0].objectValues()[0].getPhysicalPath()
>> ('', 'path', 'object')
>>
>> myObject.refList[0].objectValues()[0].absolute_url()
>> http://localhost/pfad/object
>>
>> I restart the instance and get some other results
>>
>> myObject.refList
>> [<myType at object>]
>>
>> myObject.refList[0].objectValues()[0].getPhysicalPath()
>> ('object',)
>>
>> myObject.refList[0].objectValues()[0].absolute_url()
>> 'object'
>>
>> It seems that the in list referenced object ist no more in context
>> after restart.
>>
>> the constructor for this looks like:
>>
>> object  = myObject()
>> id=myObject
>> myObject.id   = id
>> myObject.title= id
>> myObject.refList=getattr([self.context.pfad, 'object'],
>> [self.context.pfad, 'object1'])
>> self.context._setObject(id, ob)
>>     
> ======================================================================
>
> Modifying an object's list attribute "in place" doesn't mark the
> persistent object as modified ; so as soon as the object is removed from
> the cache, it's modifications are lost.
>
> You should probably :
>  - use persistent lists (persistent.list.PersistentList) instead of
>    "basic" lists
>  - mark object as modified manually (myObject._p_changed = True)
>  - or change value of object list attribute :
>        myList = myObject.refList
>        myList[0] = ...
>        myObject.refList = myList
>
> Hope this helps,
> Thierry
>   

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 <http://www.dict.cc/englisch-deutsch/following.html>:


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 <http://www.dict.cc/englisch-deutsch/already.html> befor 
restart I get without http://localhost/... <http://localhost/> see ***1

It seem's that I forgot something.  *I* 
<http://www.dict.cc/englisch-deutsch/I.html> would 
<http://www.dict.cc/englisch-deutsch/would.html> be 
<http://www.dict.cc/englisch-deutsch/be.html> *glad* 
<http://www.dict.cc/englisch-deutsch/glad.html> to if somebody explain 
me this problem.


Best regards

Vladislav




More information about the Zope mailing list