Ответ 1
Как просто использовать метод to_mongo
объекта для преобразования его в dict?
object.to_mongo()
Я использую рамки для бутылок вместе с монгогингом. У меня есть модель заказов:
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))
но это тоже не принесло пользы.
У кого-нибудь есть обходной путь для этой проблемы?
Как просто использовать метод to_mongo
объекта для преобразования его в dict?
object.to_mongo()
Развернув ответы @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())
import json
json.loads(yourobj.to_json())
объединяя все остальные ответы,
import json
dict = {'data':[json.loads(ob.to_json()) for ob in qset]}
Вы можете пользовательский метод для преобразования объекта в 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]