不太确定这是否真的很简单,但我无法真正找到关于该主题的任何内容。但是,无论是使用常规的MongoEngine库,还是Flask-MongoEngine用于我的基于Flask的网站,都可以将直接JSON返回一个MongoEngine文档?将MongoEngine文档作为JSON返回
谢谢!
不太确定这是否真的很简单,但我无法真正找到关于该主题的任何内容。但是,无论是使用常规的MongoEngine库,还是Flask-MongoEngine用于我的基于Flask的网站,都可以将直接JSON返回一个MongoEngine文档?将MongoEngine文档作为JSON返回
谢谢!
在0.8有帮手看到https://github.com/MongoEngine/mongoengine/issues/1
在此期间,你必须直接使用pymongo的json_utils:
from bson import json_util
json_util.dumps(MyDoc._collection_obj.find(MyDoc.objects()._query))
正确的解决办法也许应该是:
from bson import json_util
objects = MyDoc.objects()
json_util.dumps(objects._collection_obj.find(objects._query))
罗斯和Jellyflower的当使用字段投影或排序时,变通办法不起作用。
更一般的解决方法:
from bson import json_util
json = json_util.dumps(query._cursor)
更新:感谢Lo-Tan为to_mongo()
方法的使用建议。
最终我想出了以下解决方案:
from json import JSONEncoder
from mongoengine.base import BaseDocument
class MongoEncoder(JSONEncoder):
def default(self, o):
if isinstance(o, BaseDocument):
data = o.to_mongo()
# might not be present if EmbeddedDocument
o_id = data.pop('_id', None)
if o_id:
data['id'] = str(o_id['$oid'])
data.pop('_cls', None)
return data
else:
return JSONEncoder.default(self, o)
# consider `obj` to be MongoEngine object
json_data = json.dumps(obj, cls=MongoEncoder)
它使用to_json()
方法,添加作为响应上述issue。
调用to_json()会执行to_mongo()(它会创建你想要的字典),然后序列化它,然后你反序列化它,这是相当低效的,我认为一个更好的方法是使用[o.to_mongo()](https://gist.github.com/dhesson/e7def67f01d1de452920),因为它给你一个有序的字典,然后替换id与str值。无论如何,感谢代码,因为它带领我在正确的方向! –
甜。知道是否有方法通过pip安装mongoengine 0.8?看起来他们只有0.7.7 :( – Chiggins
还没有0.8仍然不稳定并且正在开发 – Ross