我正在做一些PloneFormGen的工作。目前,PloneFormGen在内部输入表单条目作为元组,没有关联的列信息。如果添加了新列(表单字段),则现有数据将变为无效。
这可以很容易地避免将数据存储在有序词典中,这些词典保留了输入的列顺序和列ID。
ZODB的数据类型是否等同于有序字典?如果可能,即使使用匹配的API(Python dict-like项操作和访问)?
答案 0 :(得分:5)
您可以在ZODB中使用任何现成的有序dict实现,但是您必须使用{{1}标记父对象(引用有序dict实例的对象)。每次更改或将parent = odict_instance
设置为_p_changed
时。当然,这将导致父级的新持久记录以及有序的dict实例。
如果您希望有序的dict实例本身自动检测更改,您可能必须构建自己的类,因为我不知道任何当前的实现。也就是说,这样做可能非常容易,特别是如果您使用ZODB PersistentMapping
类作为模板来构建相同版本的有序版本。不幸的是,您不能将该类用作mixin,因为它直接引用UserDict方法而不是True
调用(super()
不是新式类。)
Python 2.7在标准库中有一个有序的dict类。据推测,你仍然在Plone中使用Python 2.6,所以你必须向后移植它。但是,一旦您将其移植到后端,persistent.Persistent
实施应该是PersistentMapping
source code的直接副本,所有PersistentOrderedDict
实例都替换为您的OrderedDict端口。
答案 1 :(得分:4)
你可能不得不建立自己的类,因为我不知道任何当前的实现。
你可以在这里找到基于PersistentDict和OOBtree的ZODB持久有序dicts的实现:
https://github.com/bluedynamics/node.ext.zodb/blob/master/src/node/ext/zodb/utils.py
此实现基于odict包:
http://pypi.python.org/pypi/odict
由于无法将dict类型继承对象继承到ZODB(因为persistent.Persistent和dict具有不兼容的低级实现),因此odict提供了一种方法来轻松挂钩不同的基类(在整个地方内部使用_dict_impl函数)。这就是为什么odict包仍然用于支持甚至python 2.7的有序dict实现或其他第三方有序实现的原因。
答案 2 :(得分:2)
werkzeug和paste都提供有序的条款。你无疑会为了你的目的而腌制它们。
答案 3 :(得分:0)
如果可以对Python对象进行pickle,则可以将其保留在ZODB中。
看一下PersistantMapping,根据我的理解,创建一个这样的混合类就足够了:
class PersistantOrderedDict(PersistantMapping, OrderedDict):