Flask Jsonify mongoengine查询

bek*_*eka 5 python json simplejson mongoengine flask

我有这样的方法,并希望以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)
Run Code Online (Sandbox Code Playgroud)

小智 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())
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 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())
Run Code Online (Sandbox Code Playgroud)

在 post.py 中,添加:

def to_dict(self):
   return helper.mongo_to_dict(self)
Run Code Online (Sandbox Code Playgroud)

在 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)
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 如果你的文档有额外的字段类型,你需要增强上面的辅助函数。
  • 上面的辅助方法的灵感来自Thomas 对一个问题的回答。附加功能包括:递归打印出 EmbeddedDocuments 并包含文档的 id。