我正在做一些PloneFormGen的工作。目前PloneFormGen将内部输入的表单条目存储为不带相关列信息的元组。如果添加新列(表单域),则现有数据将变为无效。ZODB等效的命令字典(odict?)
这可以很容易地避免将数据存储在有序字典中,该字典保留输入的列顺序和列ID。
ZODB的数据类型是否等同于有序字典?如果可能的话,即使使用匹配的API(类似Python字典的项目操作和访问)?
我正在做一些PloneFormGen的工作。目前PloneFormGen将内部输入的表单条目存储为不带相关列信息的元组。如果添加新列(表单域),则现有数据将变为无效。ZODB等效的命令字典(odict?)
这可以很容易地避免将数据存储在有序字典中,该字典保留输入的列顺序和列ID。
ZODB的数据类型是否等同于有序字典?如果可能的话,即使使用匹配的API(类似Python字典的项目操作和访问)?
你可能不得不建立自己的类,因为我没有意识到任何当前的实现。
你可以找到ZODB坚持基于PersistentDict并责令类型的字典OOBtree这里实现:
https://github.com/bluedynamics/node.ext.zodb/blob/master/src/node/ext/zodb/utils.py
这个实现是基于odict包:
http://pypi.python.org/pypi/odict
由于不可能坚持dict类型继承对象ts到ZODB(因为persistent.Persistent和dict具有不兼容的低级别实现)odict提供了一种轻松挂接不同基类的方法(在内部全局使用_dict_impl函数)。这就是为什么odict包仍然用于Python甚至是Python 2的原因。7的命令字典执行或其他第三方ordereddict实现。
werkzeug和paste都提供了命令。你无疑可以为了你的目的而腌制它们。
如果一个Python对象可以被腌制,它可以被保存在ZODB中。
看看PersistantMapping,从我的理解应该是足以创造一个混合类这样的:
class PersistantOrderedDict(PersistantMapping, OrderedDict):
您可以使用任何命令字典执行乱的盒中ZODB,但必须在每次更改时使用parent = odict_instance
或通过将_p_changed
设置为True
来更改父对象(引用有序字典实例的对象)。当然,这将为父母和有序词典实例创建一个新的持久记录。
如果你想让有序的dict实例本身自动检测到变化,你可能必须建立自己的类,因为我不知道任何当前的实现。也就是说,这可能非常容易,特别是如果您使用ZODB PersistentMapping
类作为模板来构建相同的有序版本。不幸的是,您不能将该类用作混音,因为它直接引用UserDict方法而不是使用super()
调用(persistent.Persistent
不是新风格的类)。
Python 2.7在标准库中有一个有序的dict类。据推测,你仍然在Plone中使用Python 2.6,所以你不得不将它回溯。但是,一旦您将其恢复后,PersistentOrderedDict
实现应该是PersistentMapping
source code的直接副本,所有实例UserDict.IterableUserDict
都将替换为OrderedDict端口。
PersistentMapping使用对UserDict方法的直接引用,所以有序的字典更新方法将被批量绕过。 – 2012-03-26 09:58:53
@MartijnPieters你是对的。也许持久类是更好的方法。 – Fabian 2012-03-26 10:19:37