首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何序列化umongo文档

如何序列化umongo文档
EN

Stack Overflow用户
提问于 2019-02-07 17:40:21
回答 1查看 216关注 0票数 0

假设我有以下示例:

代码语言:javascript
复制
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上导致以下错误

代码语言:javascript
复制
_pickle.PicklingError: Can't pickle <Implementation class 'tests.test_serialize_umongo.User'>: it's not found as tests.test_serialize_umongo.User

我知道我不能简单地pickle一个用户,因为我不能pickle数据库实例。我想使用umongo的dump并覆盖__getstate__来限制用户,但我不知道如何避免这个it's not found as错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-16 05:20:44

如果我没有理解错的话,我相信你正在寻找的是以下内容。本质上,我们使用文档自己的dump()方法将序列化后的文档作为要进行pickled的用户进行传递。这里唯一的区别是最后一行:dill.dump(found_goku.dump(), out_file)

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54570321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档