ZODB相当于有序的dict(odict?)

时间:2012-03-26 09:01:48

标签: python plone zope zodb

我正在做一些PloneFormGen的工作。目前,PloneFormGen在内部输入表单条目作为元组,没有关联的列信息。如果添加了新列(表单字段),则现有数据将变为无效。

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

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

4 个答案:

答案 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):