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?
Qu'en est-il simplement d'utiliser to_mongo
méthode d'un objet pour le convertir en dict?
object.to_mongo()
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())
import json
json.loads(yourobj.to_json())
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()
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]
combiner toutes les autres réponses,
import json
dict = {'data':[json.loads(ob.to_json()) for ob in qset]}