不太確定這是否真的很簡單,但我無法真正找到關於該主題的任何內容。但是,無論是使用常規的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