web-dev-qa-db-ja.com

mongodb戻りオブジェクトを辞書に変換

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

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

しかし、それでも効果はありませんでした。

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

28
mahesmohan

to_mongo dictに変換するオブジェクトのメソッド?

object.to_mongo()
40
alexvassel

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

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

sons = [ob.to_mongo() for ob in qset]
for son in sons:
    print str(son.to_dict())
21
aralar
import json
json.loads(yourobj.to_json())
7

@alexvasselの答えを拡張すると、to_mongo()メソッドは SONオブジェクト を返します。これは、to_dict()メソッドを呼び出すことで、dictに変換できます。

object.to_mongo().to_dict()
1

あなたはオブジェクトをdictに変換するカスタムメソッドを使うことができます

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

    def as_dict(self):
        return {
            "user_name": self.userName,
            "order_date": self.orderDate.strftime("%Y-%m-%d %H:%M:%S"),
        }

今、あなたはdictするためにobj.as_dict()を使うことができます

orders = Order.objects.all()
datas = [each.as_dict() for each in orders]
1
joeycheng

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

import json
dict = {'data':[json.loads(ob.to_json()) for ob in qset]}
0
cegprakash