将mongoengine queryset转换为json文件

时间:2011-09-20 13:09:51

标签: python django mongodb django-queryset mongoengine

如何使用python将Mongo文档的查询集中的数据转储到.json文件?

我尝试使用django序列化程序,但是没有工作,因为django中的字段访问方式与在mongo中访问它们的方式相同。

for model in models:
    json_serializer.serialize(model.objects.all(), indent=2, stream=output_file_mongo)

我也尝试过使用python JSON编码/解码器,

import json
for model in mongo_models:
    output_file_mongo.write(json.dumps(model.objects.all()))

我得到了一个例外

  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [<MongoModelA: MongoModelA object>] is not JSON serializable

1 个答案:

答案 0 :(得分:2)

django序列化程序不知道如何处理mongoengine对象,你很可能必须编写自己的json编码器来将它们映射到一个简单的字典:

class MyEncoder(json.JSONEncoder):
    def encode_object(self, obj):
        return { 'id':unicode(obj.id), 'other_property': obj.other_property }

    def default(self, obj):
        if hasattr(obj, '__iter__'):
            return [ self.encode_object(x) for x in obj ]
        else:
            return self.encode_object(obj)

然后这样称呼它:

import json
import MyEncoder

json_string = json.dumps(model.objects.all(), cls=MyEncoder)