I have a method I use for a generic JSON output option for all pages,
although I'm sure it is far from perfect. It handles mongoengine
objects and queries as well as evaluating groupby generators. Note
that you might not want to include ObjectID references in the way I do
as my use is purely internal and doesn't care about security.
def encode_model(self, obj):
if isinstance(obj, (mongoengine.Document,
mongoengine.EmbeddedDocument)):
out = dict(obj._data)
for k,v in out.items():
if isinstance(v, ObjectId):
out[k] = str(v)
elif isinstance(obj, mongoengine.queryset.QuerySet):
out = list(obj)
elif isinstance(obj, types.ModuleType):
out = None
elif isinstance(obj, groupby):
out = [ (g,list(l)) for g,l in obj ]
else:
raise TypeError, "Could not JSON-encode type '%s': %s" % (type(obj),
str(obj))
return out
Use:
response = simplejson.dumps(data, default=encode_model)