Flask Jsonify mongoengine查询

时间:2012-12-22 13:10:21

标签: python json flask mongoengine simplejson

我有这样的方法,并希望以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)

3 个答案:

答案 0 :(得分:11)

您可以使用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())

答案 1 :(得分:3)

tl,博士:没有内置函数可以将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' answer to a question的启发。其他功能包括:递归打印EmbeddedDocuments并包含文档的ID。

答案 2 :(得分: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})