Подтвердить что ты не робот

Преобразовать возвращаемый объект mongodb в словарь

Я использую рамки для бутылок вместе с монгогингом. У меня есть модель заказов:

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

но это тоже не принесло пользы.

У кого-нибудь есть обходной путь для этой проблемы?

4b9b3361

Ответ 1

Как просто использовать метод to_mongo объекта для преобразования его в dict?

object.to_mongo()

Ответ 2

Развернув ответы @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())

Ответ 3

import json
json.loads(yourobj.to_json())

Ответ 4

объединяя все остальные ответы,

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

Ответ 5

Вы можете пользовательский метод для преобразования объекта в 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"),
        }

теперь вы можете использовать obj.as_dict(), чтобы диктовать

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