Уровень сохраняемости ZODB обнаруживает изменения, подключаясь к хуку python __setattr__
, отмечая постоянный объект как измененный каждый раз, когда вы устанавливаете атрибут.
Но если вы используете примитивный изменяемый объект, такой как словарь Python, тогда механизм сохранения не сможет обнаружить изменения, поскольку атрибут не записывается. У вас есть три варианта решения этой проблемы:
Используйте постоянное сопоставление
Постоянный пакет включает в себя постоянный класс сопоставления, который в основном представляет собой реализацию словаря Python, который является постоянным и обнаруживает изменения напрямую, подключаясь к __setitem__
и другим перехватчикам сопоставления. Объект root
в вашем примере представляет собой постоянное отображение.
Чтобы использовать, просто замените все словари постоянными сопоставлениями:
from persistent.mapping import PersistentMapping
root['layer'] = PersistentMapping()
Принудительное обнаружение изменений путем срабатывания крючка
Вы можете просто установить ключ снова или на постоянном объекте снова установить атрибут, чтобы принудительно изменить объект:
root['layer'] = root['layer']
Отметить постоянный объект как измененный
Вы можете установить флаг _p_changed
на ближайшем постоянном объекте. Ваш корневой объект - единственный постоянный объект, который у вас есть, все остальное - это словари Python, поэтому вам нужно пометить его как измененный:
root._p_changed = 1
person
Martijn Pieters
schedule
18.04.2011