for p in db.collection.find({"test_set":"abc"}):
    posts.append(p)
thejson = json.dumps({'results':posts})
return  HttpResponse(thejson, mimetype="application/javascript")

En mi Django/Python de código, yo no puedo devolver un JSON desde un mongo consulta porque de «ObjectID». El error dice que «ObjectID» no es serializable.

¿Qué tengo que hacer?
Un hacky manera sería un bucle a través de:

for p in posts:
    p['_id'] = ""
InformationsquelleAutor TIMEX | 2010-12-10

4 Comentarios

  1. 29

    La json módulo no funcionará debido a cosas como el ObjectID.

    Por suerte PyMongo proporciona json_util que …

    … permitir que[s] para la codificación especializados y
    la decodificación de BSON de documentos en Mongo
    Extendido JSON del modo Estricto. Esto permite a los
    codificar /decodificar HIJO documentos
    JSON incluso cuando se utilice un HIJO
    tipos.

  2. 23

    Aquí es un simple ejemplo, el uso de pymongo 2.2.1

    import os
    import sys
    import json
    import pymongo
    from bson import BSON
    from bson import json_util
    
    if __name__ == '__main__':
      try:
        connection = pymongo.Connection('mongodb://localhost:27017')
        database = connection['mongotest']
      except:
        print('Error: Unable to Connect')
        connection = None
    
      if connection is not None:
        database["test"].insert({'name': 'foo'})
        doc = database["test"].find_one({'name': 'foo'})
        return json.dumps(doc, sort_keys=True, indent=4, default=json_util.default)
    • json.vertederos(doc, sort_keys=True, sangría=4, por defecto=json_util.valor predeterminado) hizo resolver mi problema!
    • ¿cuál es la diferencia con el uso de json_util.dumps(doc)?
    • Debe así importación json para que este código funcione, ¿verdad?
  3. 8

    Es muy fácil escribir un serializador personalizado que hace frente a la ObjectIds. Django ya incluye uno que maneja decimales y las fechas, así que usted puede extender:

    from django.core.serializers.json import DjangoJSONEncoder
    from bson import objectid
    
    class MongoAwareEncoder(DjangoJSONEncoder):
        """JSON encoder class that adds support for Mongo objectids."""
        def default(self, o):
            if isinstance(o, objectid.ObjectId):
                return str(o)
            else:
                return super(MongoAwareEncoder, self).default(o)

    Ahora usted puede decirle a json a usar su propio serializador:

    thejson = json.dumps({'results':posts}, cls=MongoAwareEncoder)
    • Necesidad import bson para que esto funcione (sólo mencionarla porque soy un newb y me tomó mucho tiempo para averiguar)
  4. 5

    Algo aún más simple que funciona para mí en Python 3.6 uso de
    motor==1.1
    pymongo==3.4.0

    from bson.json_util import dumps, loads
    
    for mongo_doc in await cursor.to_list(length=10):
        # mongo_doc is a <class 'dict'> returned from the async mongo driver, in this acse motor /pymongo.
        # result of executing a simple find() query.
    
        json_string = dumps(mongo_doc)
        # serialize the <class 'dict'> into a <class 'str'> 
    
        back_to_dict = loads(json_string)
        # to unserialize, thus return the string back to a <class 'dict'> with the original 'ObjectID' type.

Dejar respuesta

Please enter your comment!
Please enter your name here