【问题标题】:Can't Return JSON object using MongoEngine Pymongo with Django?无法使用带有 Django 的 MongoEngine Pymongo 返回 JSON 对象?
【发布时间】:2011-09-03 01:55:03
【问题描述】:

所以我试图为一个项目返回一个 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 有什么想法吗?

【问题讨论】:

    标签: django json mongodb pymongo mongoengine


    【解决方案1】:

    使用 MongoEngine 0.8 或更高版本,对象和查询集具有 to_json() 方法。

    >>> User.objects.to_json()
    

    【讨论】:

      【解决方案2】:

      simplejson.dumps() 不知道如何“接触”您的自定义对象; default 函数,json_util.default 必须只是在您的文档上调用 str()repr()。 (json_util 是您编写的自定义代码吗?如果是,在此处显示其源代码可以证明我的说法。)

      最终,您的 default 函数需要能够理解 MongoEngine 文档。我至少可以想到两种可能的实现方式:

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

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

      我建议您使用选项 #2:代码将更简洁、更易于阅读、更好地封装,并且不需要使用任何私有 API。

      【讨论】:

        【解决方案3】:

        正如 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-27
          • 2013-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多