ZODB эквивалент упорядоченного dict (odict?) - PullRequest
3 голосов
/ 26 марта 2012

Я делаю работу с PloneFormGen. В настоящее время PloneFormGen хранит введенные записи формы внутри как кортежи без соответствующей информации столбца. При добавлении новых столбцов (полей формы) существующие данные становятся недействительными.

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

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

Ответы [ 4 ]

5 голосов
/ 26 марта 2012

Вы можете использовать любую упорядоченную реализацию 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.

4 голосов
/ 11 апреля 2012

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

Вы можете найти реализации 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 наследует объекты в ZODB (потому что persistent.Persistent и dict имеют несовместимые низкоуровневые реализации) odict предоставляет способ для простой перехвата различных базовых классов (используя функцию _dict_impl для внутреннего использования везде)По этой причине пакет odict по-прежнему используется в пользу даже упорядоченной реализации dict в Python 2.7 или других реализаций предписанного стороннего производителя.

2 голосов
/ 26 марта 2012

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

0 голосов
/ 26 марта 2012

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

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

class PersistantOrderedDict(PersistantMapping, OrderedDict):
...