Переименование my.packages в my.package

my.packages — это пользовательский пакет архетипов в каталоге src. Тысячи элементов в экземпляре Plone добавляются с его типами. Я хочу переименовать пакет как my.package. Просто удалив my.packages и установив my.package, я нахожу http://localhost:8080/mysite/myfolder/my-item показывает <persistent broken my.packages.content.mytype.MyType instance '\x00\x00\x00\x00\x00Un^'>. Должен ли я сделать миграцию? Или есть простой способ решить эту проблему?


person marr    schedule 05.03.2012    source источник


Ответы (1)


Вы можете создать псевдоним для обратной совместимости, запутавшись с sys.modules. Сделайте это в своем пакете __init__.py:

 import sys
 sys.modules['my.packages'] = sys.modules[__name__]

Таким образом, механизм постоянства все еще может найти ваши классы.

Что происходит, так это то, что когда ваши экземпляры Archetypes сохраняются в ZODB, механизм сохранения сохраняет путь модуля для класса (точечный путь Python, такой как my.packages.types.foobar.FooBar) в сохраненных данных. При восстановлении объекта из ZODB этот же путь используется для воссоздания ваших экземпляров. Когда вы переименовываете свой пакет, все эти ссылки не работают.

При использовании описанного выше трюка приятно то, что если ваш объект был изменен и снова записан в ZODB в транзакции, путь нового модуля будет сохранен. Таким образом, вы могли бы вызвать запись во все ваши экземпляры Archetypes из этого пакета, чтобы сделать миграцию постоянной, чтобы вы могли снова удалить описанный выше обходной путь.

person Martijn Pieters    schedule 07.03.2012