Уровень персистентности 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