6

私はこのようなメソッドを持っていて、 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)
4

3 に答える 3

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())
于 2013-10-25T13:48:46.813 に答える
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())

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 の回答に触発されました。追加機能には以下が含まれます: EmbeddedDocuments を再帰的に出力し、ドキュメントの ID を含めます。
于 2012-12-24T20:45:39.817 に答える