Can';使用MongoEngine Pymongo和Django返回JSON对象?
所以我试图为一个项目返回一个JSON对象。我花了几个小时试图让Django返回JSON 以下是我们一直在研究的观点:Can';使用MongoEngine Pymongo和Django返回JSON对象?,django,json,mongodb,pymongo,mongoengine,Django,Json,Mongodb,Pymongo,Mongoengine,所以我试图为一个项目返回一个JSON对象。我花了几个小时试图让Django返回JSON 以下是我们一直在研究的观点: def json(request, first_name): user = User.objects.all() #user = User.objects.all().values() result = simplejson.dumps(user, default=json_util.default) return HttpResponse(res
def json(request, first_name):
user = User.objects.all()
#user = User.objects.all().values()
result = simplejson.dumps(user, default=json_util.default)
return HttpResponse(result)
这是我的模型:
class User(Document):
gender = StringField( choices=['male', 'female', 'Unknown'])
age = IntField()
email = EmailField()
display_name = StringField(max_length=50)
first_name = StringField(max_length=50)
last_name = StringField(max_length=50)
location = StringField(max_length=50)
status = StringField(max_length=50)
hideStatus = BooleanField()
photos = ListField(EmbeddedDocumentField('Photo'))
profile =ListField(EmbeddedDocumentField('ProfileItem'))
allProfile = ListField(EmbeddedDocumentField('ProfileItem')) #only return for your own profile
这就是它的回报:
[<User: User object>, <User: User object>] is not JSON serializable
[,]不可JSON序列化
关于如何返回JSON有什么想法吗?simplejson.dumps()不知道如何“接触”自定义对象;default
函数,json\u util.default
必须只调用文档上的str()
或repr()
。(你写的是json\u util
自定义代码吗?如果是的话,在这里显示它的源代码可以证明我的说法。)
最终,您的default
函数需要能够理解MongoEngine文档。我至少可以想出两种方法来实现这一点:
default
函数,通过检查所有MongoEngine文档的\u字段
属性,该函数适用于所有MongoEngine文档(但请注意,前导下划线表示这是MongoEngine私有API/实现细节的一部分,在未来版本中可能会发生更改)as_dict
方法,该方法返回对象的字典表示形式。这将类似于MongoEngine在文档上提供的to_mongo
方法,但不应返回\u types
或\u cls
字段(同样,这些是MongoEngine的实现细节)我建议您选择选项2:代码将更干净、更易于阅读、更好地封装,并且不需要使用任何私有API。正如dcrosta建议的那样,您可以这样做,希望这将对您有所帮助 文档定义
class MyDocument(Document):
# Your document definition
def to_dict(self):
return mongo_to_dict_helper(self)
helper.py:
from mongoengine import StringField, ListField, IntField, FloatField
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, data))
else:
# You can define your logic for returning elements
return dict(return_data)
对于MongoEngine 0.8或更高版本,对象和查询集有一个
to_json()
方法
>>> User.objects.to_json()