python - 如何序列化 umongo 文档
问题描述
假设我有以下示例:
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
我知道我不能简单地腌制用户,因为我不能腌制数据库实例。我想使用 umongodump
和覆盖将用户腌制到字典__getstate__
,但我不知道如何解决这个it's not found as
错误。
解决方案
如果我理解正确,我相信您正在寻找的是以下内容。本质上,我们使用文档自己的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)
推荐阅读
- powershell-2.0 - 如何使用 powershell v 2.0 在 Windows 7 上禁用本地用户
- javascript - 将变量放入哈希的两种方法
- r - 如何使用多列使 df 更宽
- python - 为什么命名元组使用的内存比字典少?
- jquery - 仅在按下 4 个特定键时触发警报:例如,如果按该顺序按下 4 3 5 2 个键,则警报触发
- c# - How should mulitiple query string parameters be presented in swaggers?
- arrays - 如何使用 Dragula 的 drop 函数作为事件监听器来更新数组的顺序
- java - 防止在 httpClient 中发送保持活动状态
- javascript - 如何增加慢页面的灯塔超时
- python - 为什么'if'语句中的时间戳比较不能按照我的python程序中应用的逻辑工作?