Estoy usando la botella framework junto con mongoengine.
Tengo un pedidos de modelo :

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)

Cuando mongodb es consultado puedo obtener un objeto que se convierte luego en un diccionario mediante la siguiente función :

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)

Me encontré con esta función después de una larga búsqueda en la internet. Más tarde descubrí que esta función también se produce un error mientras que la definición de un miembro como el ListField(EmbeddedDocumentField(obj)).

También he tratado de escribir una condición para la captura de el caso específico de EmbeddedDocumentField :

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

pero que no le hizo nada bien tampoco.

Alguien tiene una solución para este problema ?

  • Usted está tratando de convertir a todo el queryset a un diccionario o un solo documento?
  • ¿Qué estás tratando de lograr?
  • Yo estaba tratando de convertir un objeto json yo no era consciente de la to_mongo() la función…
InformationsquelleAutor mahesmohan | 2012-11-05

5 Comentarios

  1. 41

    Lo que sobre el uso de to_mongo método de un objeto para convertirlo en un dict?

    object.to_mongo()
    • Eso es exactamente lo que estaba buscando. Pero todavía me da un error TypeError que el ObjectId no es serializable.
    • Pegar un enlace a to_mongo() la documentación será de gran appreaceated como de los que no puedo encontrar en cualquier lugar. Gracias @alexvassel
    • En realidad, no he podido encontrar este método en la documentación oficial) por Lo que sólo se busca en una fuente)
    • Y acerca de su error, pruebe a serializar el str(ObjectId). En realidad, no sé de qué estás tratando de hacer, por lo que es sólo una conjetura.
    • Es posible eliminar todos los campos de referencia de forma recursiva mediante to_mongo()?
    • cómo utilizar este método?? a partir de este inbox = Inbox.objects.filter(messages__to_users__in=[username]).to_mongo() tengo este 'BaseQuerySet' object has no attribute 'to_mongo'
    • puede utilizar una comprensión de: [ob.to_mongo() for ob in query_set]
    • Hay un from_mongo() así? ¿El to_mongo de la tienda de la metainformación para restaurar el objeto?

  2. 7
    import json
    json.loads(yourobj.to_json())
    • Gracias @roberto el boberto yo que son los hombres.
    • Esto es la respuesta correcta, y el que yo uso.
  3. 1

    la combinación de todas las otras respuestas,

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

    puede personalizar el método para convertir el objeto a 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"),
            }

    ahora usted puede utilizar obj.as_dict() dict

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

Dejar respuesta

Please enter your comment!
Please enter your name here