【问题标题】:Flask Jsonify mongoengine queryFlask Jsonify mongoengine 查询
【发布时间】:2012-12-09 19:10:33
【问题描述】:

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

【问题讨论】:

  • 为什么是__raw__=(query)?你的意思是__raw__=(query,) 还是__raw__=query

标签: python json flask mongoengine simplejson


【解决方案1】:

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

【讨论】:

  • 那不是反斜杠转义引号,因为它是双 json 化的吗?我需要做类似jsonify(result=[json.loads(post.to_json()) for post in Posts.objects]) 的事情。
【解决方案2】:

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' answer to a question。附加功能包括:递归打印出 EmbeddedDocuments 并包含文档的 id。

【讨论】:

  • my_document.to_json() 将 MongoEngine 文档转换为 JSON。不过,它不适用于 jsonify() 那个 JSON。我使用json.loads() 将其转换为字典,然后使用return jsonify() 将其转换为它,尽管可能有更好的方法。
【解决方案3】:

这行得通,虽然我不知道这是否是最有效的方法:

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-10-25
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2017-09-11
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多