使用MongoEngine Pymongo和Django无法返回JSON对象?

Joh*_*len 7 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(result)
Run Code Online (Sandbox Code Playgroud)

这是我的模特:

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
Run Code Online (Sandbox Code Playgroud)

这就是它的回归:

[<User: User object>, <User: User object>] is not JSON serializable
Run Code Online (Sandbox Code Playgroud)

关于如何才能返回JSON的任何想法?

Tei*_*man 11

对于MongoEngine 0.8或更高版本,对象和查询集都有一个to_json()方法.

>>> User.objects.to_json()
Run Code Online (Sandbox Code Playgroud)


dcr*_*sta 8

simplejson.dumps()不知道如何"进入"自定义对象; 的default功能,json_util.default必须只是打电话str()repr()在文件上.(json_util您自己编写的自定义代码吗?如果是这样,在此处显示其来源可能证明我的主张.)

最终,您的default功能需要能够理解MongoEngine文档.我可以想到至少有两种方法可以实现:

  1. default通过内省其_fields属性编写适用于所有MongoEngine文档的自定义函数(但请注意,前导下划线表示这是MongoEngine的私有API /实现细节的一部分,可能会在将来的版本中更改)

  2. 让每个文档都实现一个as_dict返回对象字典表示的方法.这与to_mongoMongoEngine在文档中提供的方法类似,但不应返回_types_cls字段(同样,这些是MongoEngine的实现细节).

我建议你使用选项#2:代码将更清晰,更易于阅读,更好的封装,并且不需要使用任何私有API.