2012-12-22 54 views
5

我有这样的方法,并希望返回的JSON,但它写道帖子对象不是Json的序列化:S瓶Jsonify mongoengine查询

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

为什么是'__raw __ =(查询)'?你的意思是'__raw __ =(query,)'或'__raw __ = query'? –

回答

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。
+0

'my_document.to_json()'将MongoEngine文档转换为JSON。它不能用于'jsonify()'那个JSON。我使用'json.loads()'将其转换为字典,然后'返回jsonify()'它,尽管可能有更好的方法。 – Josh

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()) 
+0

不是反斜杠 - 转义引号,因为它是双重json-ified?我需要做一些类似'jsonify(result = [json.loads(post.to_json())'的Posts.objects])。 – Josh

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})