3

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

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

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

4

4 回答 4

5

您可以在 ZODB 中使用任何开箱即用的有序 dict 实现,但您必须在parent = odict_instance每次更改时将父对象(引用有序 dict 实例的对象)标记为已更改,或者通过设置_p_changedTrue。当然,这将导致父级的新持久记录以及有序的 dict 实例。

如果您希望有序 dict 实例本身自动检测更改,您可能必须构建自己的类,因为我不知道任何当前的实现。也就是说,这样做可能非常容易,特别是如果您使用ZODBPersistentMapping类作为模板来了解如何构建相同的有序版本。不幸的是,您不能将该类用作 mixin,因为它直接引用 UserDict 方法而不是使用super()调用(persistent.Persistent不是新型类)。

Python 2.7 在标准库中有一个有序的 dict 类。大概您仍在 Plone 中使用 Python 2.6,因此您必须对其进行反向移植。但是,一旦您将其反向移植,PersistentOrderedDict实现应该是PersistentMapping源代码的直接副本,所有实例都UserDict.IterableUserDict替换为您的 OrderedDict 端口。

于 2012-03-26T10:03:10.443 回答
4

您可能必须构建自己的类,因为我不知道任何当前的实现。

你可以在这里找到基于 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 实现的原因。

于 2012-04-11T17:15:09.890 回答
2

werkzeug 和 paste 都提供有序字典。毫无疑问,您可以根据自己的目的腌制它们。

于 2012-03-26T09:07:12.280 回答
0

如果可以腌制 Python 对象,则可以将其持久保存在 ZODB 中。

看看PersistantMapping,据我了解,创建这样的混合类就足够了:

class PersistantOrderedDict(PersistantMapping, OrderedDict):
于 2012-03-26T09:10:33.933 回答