6

我有这样的方法,并想以 Json 的形式返回,但它写道 Posts 对象不是 Json 可序列化的:S

def show_results_async(text):
   query  =  { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]}
   posts = Posts.objects(__raw__=(query))
   return jsonify(result = posts)
4

3 回答 3

12

您可以使用 mongoengine 内置方法:to_json()。上面的例子,你可以这样使用:

def show_results_async(text):
   query  =  { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]}
   posts = Posts.objects(__raw__=(query))
   return jsonify(result = posts.to_json())
于 2013-10-25T13:48:46.813 回答
5

tl,dr:没有内置函数可以将 MongoEngine 文档转换为 JSON。所以你需要自己写。

在views.py中:

def show_results_async(text):
   query  =  { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]}
   posts = Posts.objects(__raw__=(query))
   return jsonify(result=posts.to_dict())

在 post.py 中,添加:

def to_dict(self):
   return helper.mongo_to_dict(self)

在 helper.py 中:

def mongo_to_dict(obj):
    return_data = []

    if isinstance(obj, Document):
        return_data.append(("id",str(obj.id)))

    for field_name in obj._fields:

        if field_name in ("id",):
            continue

        data = obj._data[field_name]

        if isinstance(obj._fields[field_name], DateTimeField):
            return_data.append((field_name, str(data.isoformat())))
        elif isinstance(obj._fields[field_name], StringField):
            return_data.append((field_name, str(data)))
        elif isinstance(obj._fields[field_name], FloatField):
            return_data.append((field_name, float(data)))
        elif isinstance(obj._fields[field_name], IntField):
            return_data.append((field_name, int(data)))
        elif isinstance(obj._fields[field_name], ListField):
            return_data.append((field_name, data))
        elif isinstance(obj._fields[field_name], EmbeddedDocumentField):
            return_data.append((field_name, mongo_to_dict(data)))

    return dict(return_data)

几点注意事项:

  • 如果你的文档有额外的字段类型,你需要增强上面的辅助函数。
  • 上面的辅助方法受到Thomas 对问题的回答的启发。附加功能包括:递归打印 EmbeddedDocuments 并包含文档的 id。
于 2012-12-24T20:45:39.817 回答
1

这可行,但我不知道这是否是最有效的方法:

import json

@app.route('/api/my-objects/')
def get_objects():
    all_objects = [json.loads(o.to_json()) for o in MyObject.objects]

    return jsonify({"my_objects": all_objects})
于 2015-12-11T20:51:38.057 回答