将mongodb返回对象转换为字典

mah*_*han 28 python mongodb mongoengine bottle python-2.7

我正在使用瓶子框架和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)
Run Code Online (Sandbox Code Playgroud)

当查询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)
Run Code Online (Sandbox Code Playgroud)

经过长时间的互联网搜索,我发现了这个功能.后来发现,在将成员定义为ListField(EmbeddedDocumentField(obj))时,此函数也会失败.

我还尝试编写一个条件来捕获EmbeddedDocumentField的特定情况:

elif isinstance(obj._fields[field_name], EmbeddedDocumentField):
    return_data.append(mongo_to_dict_helper(data))
Run Code Online (Sandbox Code Playgroud)

但这也没有任何好处.

任何人都有解决此问题的方法?

ale*_*sel 44

如何使用to_mongo对象的方法将其转换为dict?

object.to_mongo()
Run Code Online (Sandbox Code Playgroud)

  • 粘贴to_mongo()文档的链接将大大增加,因为我无法在任何地方找到它.谢谢@alexvassel (5认同)
  • @holms你可以使用一个理解:`[ob.to_mongo()for query in query_set]` (4认同)
  • 这正是我要找的。但是我仍然收到一个错误 TypeError,即 ObjectId 不可序列化。 (3认同)
  • @alexvassel如何使用这种方法?从这个`inbox = Inbox.objects.filter(messages__to_users__in = [username]).to_mongo()`我得到这个''BaseQuerySet'对象没有属性'to_mongo' (2认同)

ara*_*lar 25

扩展@ alexvassel和@ z0r的答案,调用.to_mongo()将对象转换为SON实例.一旦拥有它,您可以调用其.to_dict()方法将其转换为字典.

例如......(qset是一个从mongoengine返回的查询集,例如Posts.objects.all()).

sons = [ob.to_mongo() for ob in qset]
for son in sons:
    print str(son.to_dict())
Run Code Online (Sandbox Code Playgroud)


小智 8

import json
json.loads(yourobj.to_json())
Run Code Online (Sandbox Code Playgroud)


Mus*_*cim 6

扩展@alexvassel 的答案,to_mongo()方法返回SON object,您可以通过调用其to_dict()方法将其转换为 dict

object.to_mongo().to_dict()
Run Code Online (Sandbox Code Playgroud)