my.packages是src目录中的自定义archetypes包。 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^'>
。我应该做迁移吗?或者有一种简单的方法可以解决这个问题吗?
答案 0 :(得分:5)
您可以通过使用sys.modules
进行反复创建别名以实现向后兼容。在您的包__init__.py
:
import sys
sys.modules['my.packages'] = sys.modules[__name__]
这样,持久性机制仍可以找到你的课程。
当您的Archetypes实例持久存储在ZODB中时,持久性机制会在存储的数据中存储类的模块路径(点缀的python路径,如my.packages.types.foobar.FooBar
)。从ZODB恢复对象时,将使用相同的路径重新创建实例。重命名包时,所有这些引用都会被破坏。
通过上述技巧,好处是如果您的对象在事务中被更改并再次写入ZODB,则将存储 new 模块路径。因此,您可以设想从此包中写入所有Archetypes实例,以使迁移成为永久迁移,以便您可以再次删除上述解决方法。