31
The json module won’t work due to things like the ObjectID.
Luckily PyMongo provides json_util which …
… allow[s] for specialized encoding and
decoding of BSON documents into Mongo
Extended JSON’s Strict mode. This lets
you encode / decode BSON documents to
JSON even when they use special BSON
types.
27
Here is a simple sample, using 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)
- [Django]-FileUploadParser doesn't get the file name
- [Django]-Django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet. (django 2.0.1)(Python 3.6)
- [Django]-Django Framework – Is there a shutdown event that can be subscribed to?
9
It’s pretty easy to write a custom serializer which copes with the ObjectIds. Django already includes one which handles decimals and dates, so you can extend that:
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)
Now you can just tell json
to use your custom serializer:
thejson = json.dumps({'results':posts}, cls=MongoAwareEncoder)
- [Django]-Why is mod_wsgi not able to write data? IOError: failed to write data
- [Django]-How to avoid AppConfig.ready() method running twice in Django
- [Django]-How do I modify the session in the Django test framework
8
Something even simpler which works for me on Python 3.6 using
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.
- [Django]-Count number of records by date in Django
- [Django]-Dynamically exclude or include a field in Django REST framework serializer
- [Django]-Django CSRF Cookie Not Set
Source:stackexchange.com