我正在做一些 PloneFormGen 工作。目前 PloneFormGen 在内部将输入的表单条目存储为元组,而没有关联的列信息。如果添加了新列(表单域),则现有数据将变为无效。
这可以很容易地避免将数据存储在有序字典中,该字典保留输入的列顺序和列 ID。
ZODB 是否具有等效于有序字典的数据类型?如果可能,即使使用匹配的 API(类似 Python dict 的项目操作和访问)?
您可以在 ZODB 中使用任何开箱即用的有序 dict 实现,但您必须在parent = odict_instance
每次更改时将父对象(引用有序 dict 实例的对象)标记为已更改,或者通过设置_p_changed
为True
。当然,这将导致父级的新持久记录以及有序的 dict 实例。
如果您希望有序 dict 实例本身自动检测更改,您可能必须构建自己的类,因为我不知道任何当前的实现。也就是说,这样做可能非常容易,特别是如果您使用ZODBPersistentMapping
类作为模板来了解如何构建相同的有序版本。不幸的是,您不能将该类用作 mixin,因为它直接引用 UserDict 方法而不是使用super()
调用(persistent.Persistent
不是新型类)。
Python 2.7 在标准库中有一个有序的 dict 类。大概您仍在 Plone 中使用 Python 2.6,因此您必须对其进行反向移植。但是,一旦您将其反向移植,PersistentOrderedDict
实现应该是PersistentMapping
源代码的直接副本,所有实例都UserDict.IterableUserDict
替换为您的 OrderedDict 端口。
您可能必须构建自己的类,因为我不知道任何当前的实现。
你可以在这里找到基于 PersistentDict 和 OOBtree 的 ZODB 持久化有序字典的实现:
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 实现或其他第 3 方有序dict 实现的原因。
werkzeug 和 paste 都提供有序字典。毫无疑问,您可以根据自己的目的腌制它们。
如果可以腌制 Python 对象,则可以将其持久保存在 ZODB 中。
看看PersistantMapping,据我了解,创建这样的混合类就足够了:
class PersistantOrderedDict(PersistantMapping, OrderedDict):