2012-03-26 5 views
3

Я выполняю работу PloneFormGen. В настоящее время PloneFormGen хранит введенные записи форм внутренне как кортежи без соответствующей информации о столбцах. Если новые столбцы (поля формы) добавляются, то существующие данные становятся недействительными.ZODB эквивалент упорядоченного dict (odict?)

Этого можно было бы легко избежать, сохранив данные в упорядоченных словарях, которые сохраняют как введенный порядок столбцов, так и идентификаторы столбцов.

Имеет ли ZODB тип данных, эквивалентный упорядоченному словарю? Если возможно, даже при сопоставлении API (манипуляция и доступ к элементу типа Python)?

ответ

4

вам, возможно, придется создать свой собственный класс, как я не знаю ни текущих реализациях.

Вы можете найти реализацию ZODB сохраняющиеся заказанные dicts на основе PersistentDict и OOBtree здесь:

https://github.com/bluedynamics/node.ext.zodb/blob/master/src/node/ext/zodb/utils.py

This реализации основаны на упаковке odict:

http://pypi.python.org/pypi/odict

Так как невозможно наследовать тип dict, наследующий objec ts в ZODB (поскольку persistent.Persistent и dict имеют несовместимые реализации на низком уровне), odict обеспечивает способ для легкого подключения разных базовых классов (с использованием функции _dict_impl внутренне повсюду). Именно поэтому пакет odict по-прежнему используется в пользу даже python 2.7 приказанной имплантации или других сторонних заказных реализациях.

2

И werkzeug и паста предоставляют заказчикам. Вы, несомненно, могли бы раскрыть их для своих целей.

0

Если объект Python можно мариновать, он может сохраняться в ZODB.

Взгляните на PersistantMapping, от того, что я понимаю, что это должно быть достаточно, чтобы создать микс-в классе, как это:

class PersistantOrderedDict(PersistantMapping, OrderedDict): 
+2

PersistentMapping использует прямые ссылки на методы UserDict, поэтому упорядоченные методы обновления dict будут обойдены оптовой торговлей. –

+0

@MartijnPieters вы правы. Может быть, упорный класс - лучший подход. – Fabian

5

Вы можете использовать любую упорядоченную реализацию Dict вне коробки в ZODB, но вы должны будете пометить родительский объект (объект, который относится к упорядоченному экземпляру dict), который был изменен с помощью parent = odict_instance каждый раз, когда вы его изменяете, или установив _p_changed в True. Это, конечно же, приведет к появлению новой постоянной записи для родителя вместе с упорядоченным экземпляром dict.

Если вы хотите, чтобы упорядоченный экземпляр dict автоматически обнаруживал изменения, вам, вероятно, придется создавать свой собственный класс, поскольку мне неизвестны какие-либо текущие реализации. Тем не менее, это, вероятно, очень легко сделать, особенно если вы используете класс ZODB PersistentMapping в качестве шаблона о том, как создать упорядоченную версию. Вы не можете использовать этот класс как mixin, к сожалению, поскольку он ссылается непосредственно на методы UserDict вместо использования вызовов super() (persistent.Persistent не является классом нового стиля).

Python 2.7 имеет упорядоченный класс dict в стандартной библиотеке. Предположительно, вы по-прежнему используете Python 2.6 в Plone, поэтому вам придется его поддерживать. Однако, если у вас есть это backported, реализация PersistentOrderedDict должна быть прямой копией из PersistentMapping source code, причем все экземпляры UserDict.IterableUserDict заменены на ваш порт OrderedDict.