36

mongoengine と一緒に bottle フレームワークを使用しています。私は注文モデルを持っています:

class OrderDetail(Option):
    orderDetailsQty = FloatField()

    def to_dict(self):
        return mongo_to_dict_helper(self)


class Order(Document):
    userName = StringField(required=True)
    orderDate = DateTimeField()
    orderStatus = ListField(EmbeddedDocumentField(Status))
    orderDetails = ListField(EmbeddedDocumentField(OrderDetail))
    orderComments = ListField(EmbeddedDocumentField(Comment))
    isActive = BooleanField()

    def to_dict(self):
        orderObj = mongo_to_dict_helper(self)
        orderDetailList = []
        for orderDetail in orderObj["orderDetails"]:
            orderDetailList.append(orderDetail.__dict__)
        orderObj["OrderDetails"] = orderDetailList
        return (self)

mongodb が照会されると、次の関数を使用して dict に変換されるオブジェクトを取得します。

def mongo_to_dict_helper(obj):
    return_data = []
    for field_name in obj._fields:
        if field_name in ("id",):
            continue
        data = obj._data[field_name]

        if 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, int(data)))
        else:
            # You can define your logic for returning elements
            pass
    return dict(return_data)

インターネットで長い間検索した後、この機能を見つけました。メンバーを ListField(EmbeddedDocumentField(obj)) として定義しているときに、この関数も失敗することが後でわかりました。

EmbeddedDocumentField の特定のケースをキャッチするための条件も書いてみました。

elif isinstance(obj._fields[field_name], EmbeddedDocumentField):
    return_data.append(mongo_to_dict_helper(data))

しかし、それも何の役にも立ちませんでした。

誰でもこの問題の回避策を持っていますか?

4

7 に答える 7

54

to_mongoオブジェクトのメソッドを使用してそれをdictに変換するのはどうですか?

object.to_mongo()
于 2012-11-05T10:47:45.327 に答える
32

@alexvassel と @z0r の回答を拡張すると、呼び出し.to_mongo()によってオブジェクトがSON インスタンスに変換されます。取得したら、その.to_dict()メソッドを呼び出して辞書に変換できます。

たとえば... (qsetは、eg の後に mongoengine から返されるクエリセットですPosts.objects.all())。

sons = [ob.to_mongo() for ob in qset]
for son in sons:
    print str(son.to_dict())
于 2015-01-09T06:09:10.827 に答える
11
import json
json.loads(yourobj.to_json())
于 2015-05-15T16:23:13.223 に答える
7

@alexvassel の回答を拡張すると、メソッドはSON objectto_mongo()を返します。これは、そのメソッドを呼び出して dict に変換できますto_dict()

object.to_mongo().to_dict()
于 2019-11-08T11:12:24.877 に答える
0

他のすべての回答を組み合わせて、

import json
dict = {'data':[json.loads(ob.to_json()) for ob in qset]}
于 2018-06-14T14:43:03.490 に答える