web-dev-qa-db-fra.com

Convertir l'objet de retour mongodb en dictionnaire

J'utilise le cadre de la bouteille avec mongoengine. J'ai un modèle de commandes:

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)

Lorsque mongodb est interrogé, j'obtiens un objet qui est ensuite converti en dict en utilisant la fonction suivante:

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)

J'ai trouvé cette fonction après une longue recherche sur Internet. Plus tard, j'ai découvert que cette fonction échouait également lors de la définition d'un membre comme ListField (EmbeddedDocumentField (obj)).

J'ai également essayé d'écrire une condition pour intercepter le cas spécifique d'EmbeddedDocumentField:

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

mais cela n'a pas fait de bien non plus.

Quelqu'un a une solution à ce problème?

28
mahesmohan

Qu'en est-il simplement d'utiliser to_mongo méthode d'un objet pour le convertir en dict?

object.to_mongo()
40
alexvassel

En développant les réponses de @ alexvassel et @ z0r, ​​l'appel de .to_mongo() convertit l'objet en instance SON . Une fois que vous l'avez, vous pouvez appeler sa méthode .to_dict() pour la convertir en dictionnaire .

Par exemple ... (qset est un ensemble de requêtes renvoyé par mongoengine, après par exemple Posts.objects.all()).

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

S'étendant sur la réponse de @ alexvassel, la méthode to_mongo() renvoie objet SON , que vous pouvez convertir en dict en appelant sa méthode to_dict()

object.to_mongo().to_dict()
1

vous pouvez personnaliser la méthode pour convertir un objet en 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"),
        }

vous pouvez maintenant utiliser obj.as_dict () pour dicter

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

combiner toutes les autres réponses,

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