Как сериализовать документы умонго - PullRequest
0 голосов
/ 07 февраля 2019

Допустим, у меня есть следующий пример:

from datetime import datetime
import dill
from pymongo import MongoClient
from umongo import Instance, Document, fields, validate

db = MongoClient().test
instance = Instance(db)

@instance.register
class User(Document):
    email = fields.EmailField(required=True, unique=True)
    birthday = fields.DateTimeField(validate=validate.Range(min=datetime(1900, 1, 1)))
    friends = fields.ListField(fields.ReferenceField("User"))

    class Meta:
        collection = db.user

User.ensure_indexes()

goku = User(email='goku@sayen.com', birthday=datetime(1984, 11, 20))
goku.commit()

found_goku = User.find_one({"email": 'goku@sayen.com'})
with open("dumped.dil", "wb") as out_file:
    dill.dump(found_goku, out_file)

Это приводит к следующей ошибке на dill.dump:

_pickle.PicklingError: Can't pickle <Implementation class 'tests.test_serialize_umongo.User'>: it's not found as tests.test_serialize_umongo.User

Я понимаю, что не могу просто выбрать пользователяпотому что я не могу мариновать экземпляр базы данных.Я хочу привязать пользователя к Dict, используя умонго dump и переопределить __getstate__, но я не знаю, как обойти эту ошибку it's not found as.

1 Ответ

0 голосов
/ 16 февраля 2019

Если я вас правильно понимаю, я считаю, что вы ищете следующее.По сути, мы используем собственный метод dump() документа, чтобы передать сериализованный документ как пользователя, которого нужно выбрать.Единственная разница здесь - последняя строка: dill.dump(found_goku.dump(), out_file):

from datetime import datetime
import dill
from pymongo import MongoClient
from umongo import Instance, Document, fields, validate

db = MongoClient().test
instance = Instance(db)

@instance.register
class User(Document):
    email = fields.EmailField(required=True, unique=True)
    birthday = fields.DateTimeField(validate=validate.Range(min=datetime(1900, 1, 1)))
    friends = fields.ListField(fields.ReferenceField("User"))

    class Meta:
        collection = db.user

User.ensure_indexes()

goku = User(email='goku@sayen.com', birthday=datetime(1984, 11, 20))
goku.commit()

found_goku = User.find_one({"email": 'goku@sayen.com'})
with open("dumped.dil", "wb") as out_file:
    dill.dump(found_goku.dump(), out_file)
...