2012-03-26 77 views
3

我正在做一些PloneFormGen的工作。目前PloneFormGen将内部输入的表单条目存储为不带相关列信息的元组。如果添加新列(表单域),则现有数据将变为无效。ZODB等效的命令字典(odict?)

这可以很容易地避免将数据存储在有序字典中,该字典保留输入的列顺序和列ID。

ZODB的数据类型是否等同于有序字典?如果可能的话,即使使用匹配的API(类似Python字典的项目操作和访问)?

回答

4

你可能不得不建立自己的类,因为我没有意识到任何当前的实现。

你可以找到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实现。

2

werkzeug和paste都提供了命令。你无疑可以为了你的目的而腌制它们。

0

如果一个Python对象可以被腌制,它可以被保存在ZODB中。

看看PersistantMapping,从我的理解应该是足以创造一个混合类这样的:

class PersistantOrderedDict(PersistantMapping, OrderedDict): 
+2

PersistentMapping使用对UserDict方法的直接引用,所以有序的字典更新方法将被批量绕过。 – 2012-03-26 09:58:53

+0

@MartijnPieters你是对的。也许持久类是更好的方法。 – Fabian 2012-03-26 10:19:37

5

您可以使用任何命令字典执行乱的盒中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端口。