Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';使用MongoEngine Pymongo和Django返回JSON对象?_Django_Json_Mongodb_Pymongo_Mongoengine - Fatal编程技术网

Can';使用MongoEngine Pymongo和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

所以我试图为一个项目返回一个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)
这是我的模型:

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()