Как сопоставить пользовательский тип в Ming ODM?

Я нахожусь в процессе настройки сопоставления в Ming ODM. Одна из возникших проблем заключается в том, как сопоставить пользовательский тип с полем и как передать этот пользовательский тип в .query.

По сути, у меня есть объект для представления идентификатора клиента. Я бы хотел, чтобы FieldProperty принимал и возвращал объект этого типа, а не один из встроенных типов. Тип может быть преобразован в int и из него, и он будет храниться как int в Mongo, но в модели данных и другом коде Python я хочу передать его как этот тип, специфичный для предметной области.

При передаче экземпляра типа CustomerID напрямую в качестве аргумента kwd в .query PyMongo жалуется, что не понимает этот тип.


person kbluck    schedule 21.05.2012    source источник


Ответы (1)


Недавно я хотел сделать что-то подобное; хранение IP-адресов в виде двоичных данных в MongoDB через Ming. (Причина этого заключалась в том, чтобы разрешить эффективные запросы CIDR.) Я предлагаю свое решение для всех, кто случайно столкнется с этим вопросом, пытаясь сделать то же самое, даже если может быть слишком поздно, чтобы помочь @kbluck.

Я добился этой работы, хотя и сделал свой класс IP-адреса подклассом bson.Binary (я использую Python 2; для Python 3 вместо этого будет использоваться подкласс встроенного типа binary).

Вы бы сделали свой класс CustomerID подклассом int. Класс CustomerID должен иметь полиморфный конструктор, который принимает int (для загрузки из базы данных), экземпляр CustomerID (конструктор копирования) и любой другой конструктор, который необходимо использовать приложению (в моем примере строка представления IP-адреса).

Это не совсем то, о чем вы просили; FieldProperty принимает либо int, либо ваш тип и возвращает специальный int, который знает, как преобразовать его в ваш тип.

Я загрузил полный пример (IP-адресов) как суть: https://gist.github.com/3854792

person gmacon    schedule 08.10.2012