Посмотрите на этот вопрос. Также может оказаться полезной информация о константах в руководстве по PHP.
В 0.8 есть помощники, см. https://github.com/MongoEngine/mongoengine/issues/1
, тем временем вы должны напрямую использовать json_utils pymongo:
from bson import json_util
json_util.dumps(MyDoc._collection_obj.find(MyDoc.objects()._query))
Обновление: благодаря 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()
, добавленный как ответ на вышеупомянутую проблему .
Обходные пути Ross и Jellyflower не работают, когда используется проекция поля или упорядочение.
Более общее обходное решение:
from bson import json_util
json = json_util.dumps(query._cursor)
Возможно, правильное обходное решение должно быть:
from bson import json_util
objects = MyDoc.objects()
json_util.dumps(objects._collection_obj.find(objects._query))