Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2010 11:13:07

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB редактирование объекта

Есть объект Object с атрибутами name и value.
Если записывать значения напрямую из объекта, к примеру

self.context.value = True
то значение сохраняется.
А если переписывать в цикле, например:
        for i in self.context.values():
i.name = u'hello world'
то после рестарта значение вернётся к тому, которое было изначально.
Так тот же эффект:
        for i in self.context.values():
i.name = u'hello world'
transaction.commit()
В чём проблема?



Офлайн

#2 Сен. 28, 2010 13:02:03

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

BB редактирование объекта

Попробуйте notify

from zope.event import notify
...
for i in self.context.values():
i.name = u'hello world'
notify(ObjectModifiedEvent(i))



Офлайн

#3 Сен. 28, 2010 13:03:43

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB редактирование объекта

А почему напрямую transaction.commit() не работает?

from zope.event import notify
from zope.lifecycleevent import ObjectModifiedEvent

for i in self.context.values():
i.name = u'hello world'
notify(ObjectModifiedEvent(i))
так тоже не работает =(
после перезагрузки возвращаются предыдущие значения



Отредактировано (Сен. 28, 2010 13:10:01)

Офлайн

#4 Сен. 28, 2010 13:27:56

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB редактирование объекта

проверил, ошибся.

self.context.value = True
так значения тоже не сохраняются



Офлайн

#5 Сен. 28, 2010 13:34:00

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

BB редактирование объекта

Можно узнать, что такое self.context, и что такое self.context.values()?



Офлайн

#6 Сен. 28, 2010 13:37:16

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB редактирование объекта

нашёл проблему..
тупанул нипадецки
объект не персистентентный



Офлайн

#7 Сен. 28, 2010 13:42:48

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

BB редактирование объекта

LightOfMooN
ект не персистентентный
Было предположение =)



Офлайн

#8 Сен. 28, 2010 14:28:48

Sleepwalker
От:
Зарегистрирован: 2008-07-18
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

BB редактирование объекта

Еще бывают случаи когда мы изменяем у обьекта поле типа list.

Тогда еле написать (считае что type(value) - list ):

  self.context.value.append(some_object)
не сработает (теоретически :) ).

Следует в таких случаях явно говорить что обьект изменен:
self.context._p_changed = 1
Ну это в том случае есле вы работаете с ZODB.



Офлайн

#9 Сен. 30, 2010 13:42:19

LightOfMooN
От:
Зарегистрирован: 2010-09-11
Сообщения: 127
Репутация: +  0  -
Профиль   Отправить e-mail  

BB редактирование объекта

кусок кода:

                    if self.context.__parent__ in prop.props.get(lastvalue, []):
prop.props[lastvalue].remove(self.context.__parent__)
if prop.props.has_key(self.context.value):
prop.props[self.context.value].append(self.context.__parent__)
else:
prop.props[self.context.value] = [self.context.__parent__]
prop._p_changed = 1
ObjectModifiedEvent(prop)
Не смотря на “prop._p_changed = 1” и “ObjectModifiedEvent(prop)” всеравно не сохраняет =(

Объект персистентный (class TBool_Info(Persistent))



Офлайн

#10 Сен. 30, 2010 13:48:55

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

BB редактирование объекта

Если у вашего объекта есть атрибут-словарь или список, при внесении изменений внутри списка, система не поймет, что изменения произошли, так как ссылка на этот
атрибут осталась старая

from copy import copy
_props = copy(prop.props)
.... # Делаем все необходимое с _props
prop.props = _props



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version