首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask Jsonify mongoengine查询

Flask Jsonify mongoengine查询
EN

Stack Overflow用户
提问于 2012-12-22 21:10:21
回答 3查看 4.8K关注 0票数 6

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

代码语言:javascript
复制
def show_results_async(text):
   query  =  { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]}
   posts = Posts.objects(__raw__=(query))
   return jsonify(result = posts)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-25 04:45:40

tl,dr:没有将MongoEngine文档转换为JSON的内置函数。因此,您需要编写自己的代码。

在views.py中:

代码语言:javascript
复制
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中,添加:

代码语言:javascript
复制
def to_dict(self):
   return helper.mongo_to_dict(self)

在helper.py中:

代码语言:javascript
复制
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。
票数 5
EN

Stack Overflow用户

发布于 2013-10-25 21:48:47

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

代码语言:javascript
复制
def show_results_async(text):
   query  =  { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]}
   posts = Posts.objects(__raw__=(query))
   return jsonify(result = posts.to_json())
票数 12
EN

Stack Overflow用户

发布于 2015-12-12 04:51:38

这是可行的,尽管我不知道这是否是最有效的方式:

代码语言:javascript
复制
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})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14003103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档