Вы можете использовать любую упорядоченную реализацию dict "из коробки" в ZODB, но вам придется пометить родительский объект (объект, который ссылается на упорядоченный экземпляр dict) как измененный, используя либо parent = odict_instance
каждый раз, когда вы меняете его или устанавливаете _p_changed
на True
. Это, конечно, приведет к новой постоянной записи для родителя вместе с упорядоченным экземпляром dict.
Если вы хотите, чтобы сам упорядоченный экземпляр dict автоматически обнаруживал изменения, вам, вероятно, придется создать свой собственный класс, поскольку я не знаю ни о каких текущих реализациях. Тем не менее, это, вероятно, чрезвычайно легко сделать, особенно если вы используете класс ZODB PersistentMapping
в качестве шаблона для создания упорядоченной версии того же самого. К сожалению, вы не можете использовать этот класс в качестве миксина, поскольку он ссылается непосредственно на методы UserDict вместо использования вызовов super()
(persistent.Persistent
не является классом нового стиля).
Python 2.7 имеет упорядоченный класс dict в стандартной библиотеке. Предположительно, вы все еще используете Python 2.6 в Plone, поэтому вам придется его портировать. Однако, как только вы создадите его обратно, реализация PersistentOrderedDict
должна быть прямой копией из PersistentMapping
исходного кода , с заменой всех экземпляров UserDict.IterableUserDict
на ваш порт OrderedDict.