Переименование my.packages в my.package - PullRequest
5 голосов
/ 05 марта 2012

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^'>. Должен ли я сделать миграцию? Или есть простой способ решить эту проблему?

1 Ответ

5 голосов
/ 07 марта 2012

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

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

Таким образом, механизм персистентности может по-прежнему находить ваши классы.

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

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

...