mongoengine的更可读的json序列化程序/反序列化程序
mongoengine-goodjson的Python项目详细描述
用于MongoEngine的更可读的JSON序列化程序/反序列化程序
这是什么?
此脚本使mongoengine文档json序列化更加自然。
为什么发明这个?
使用mongoengine创建一些东西(例如restful api),有时 可能希望将数据库中的数据序列化为json,但有些字段 很奇怪,不适合前端/api:
{"_id":{"$oid":"5700c32a1cbd5856815051ce"},"name":"Hiroaki Yamamoto","registered_date":{"$date":1459667811724}}
两点:
_id
可能不需要,因为jslint不同意_
字符,除非 声明jslint nomen:true
- 有
$oid
和$date
这样的子字段。这些领域被称为 MongoDB Extended JSON。但是,考虑到Mongoengine是ODM和 因此它有模式定义方法,字段不应该有 特殊领域。特别是在某些问题上,你可能会No such property $oid of undefined
处理上面生成的 前端数据。
要解决这些问题,生成的数据应该如下:
{"id":"5700c32a1cbd5856815051ce","name":"Hiroaki Yamamoto","registered_date":1459667811724}
通过重新映射可以实现上述结构,但是如果我们在 API's controller object,代码可能会变得超级脏:
"""Dirty code."""importmongoengineasdbclassUser(db.Document):"""User class."""name=db.StringField(required=True,unique=True)registered_date=db.DateTimeField()defget_user(self):"""Get user."""models=[{("id"ifkey=="_id"elsekey):(value.pop("$oid")if"$oid"invalueandisinstance(value,dict)elsevalue.pop("$date")if"$date"invalueandisinstance(value,dict)elsevalue#What if there are the special fields in child dict?)for(key,value)indoc.items()}fordocinUser.objects(pk=ObjectId("5700c32a1cbd5856815051ce"))]returnjson.dumps(models,indent=2)
为了解决这个问题,我开发了这个scirpt。用这个 脚本,您不需要进行上述转换。即
"""A little-bit clean code."""importmongoengineasdbimportmongoengine_goodjsonasgjclassUser(gj.Document):"""User class."""name=db.StringField(required=True,unique=True)registered_date=db.DateTimeField()defget_user(self):"""Get user."""returnmodel_cls.objects(pk=ObjectId("5700c32a1cbd5856815051ce")).to_json(indent=2)
如何使用
通常您可以像往常一样定义文档,但您可能希望继承
mongoengine_goodjson.Document
或mongoengine_goodjson.EmbeddedDocument
。
下面是示例:
"""Example schema."""importmongoengine_goodjsonasgjimportmongoengineasdbclassAddress(gj.EmbeddedDocument):"""Address schema."""street=db.StringField()city=db.StringField()state=db.StringField()classUser(gj.Document):"""User data schema."""name=db.StringField()email=db.EmailField()address=db.EmbeddedDocumentListField(Address)
更多细节…医生来了!
如果你想知道更多,你需要阅读read the doc。 你现在可以喝杯咖啡了!!
贡献
详情请read the doc。