将django ValuesQuerySet转换为json对象

时间:2011-07-06 18:25:23

标签: python django json

我正在尝试使用Django中的ValuesQuerySet功能将查询返回的字段数限制为仅我需要的字段数。我想将此数据集序列化为JSON对象但是,Django不断抛出错误。下面我已经包含了我的代码和我收到的错误:

objectList = ConventionCard.objects.values('fileName','id').filter(ownerUser = user)
data = serializers.serialize('json', objectList)
return HttpResponse(data, mimetype='application/javascript')

错误:

Exception Type:     AttributeError
Exception Value:    'dict' object has no attribute '_meta'
Exception Location:     C:\Python27\lib\site-packages\django\core\serializers\base.py in serialize, line 41

谢谢!

4 个答案:

答案 0 :(得分:34)

首先将ValuesQuerySet强制转换为列表:

query_set = ConventionCard.objects.values('fileName','id').filter(ownerUser = user)

list(query_set)

按照ars的建议删除values调用会导致管理员从表中提取所有列,而不是仅提取您需要的两列。

答案 1 :(得分:14)

使用QuerySet通过serialize方法在值列表中尝试subsetting the fields

from django.core import serializers
objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', objectQuerySet, fields=('fileName','id'))

答案 2 :(得分:9)

使用上面的dict方法时,我继续得到_meta对象没有属性list()错误。但是我发现this snippet可以解决问题

def ValuesQuerySetToDict(vqs):
    return [item for item in vqs]

# Usage
data = MyModel.objects.values('id','title','...','...')
data_dict = ValuesQuerySetToDict(data)
data_json = simplejson.dumps(data_dict)

答案 3 :(得分:1)

只是添加一些我发现的细节:

当我尝试@ars回答指定字段时,例如:

s_logs = serializers.serialize("json", logs, fields=('user', 'action', 'time'))

我明白了:

[{"pk": 520, "model": "audit.auditlog", "fields": {"user": 3, "action": "create", "time":"2012-12-16T12:13:45.540"}}, ... ]

这不是我想要的值的简单序列化。

所以我尝试了@Aaron提出的解决方案,将valuesqueryset转换为列表,由于默认编码器无法处理浮点数或日期时间对象,因此第一次无效。

所以我使用@Aaron解决方案,但使用django的序列化程序(DjangoJSONEncoder)使用的JSON编码器,将其作为kwarg传递给simplejson.dumps(),如下所示:

s_logs = list(logs.values('user', 'ip', 'object_name', 'object_type', 'action', 'time'))

return HttpResponse(simplejson.dumps( s_logs, cls=DjangoJSONEncoder ), mimetype='application/javascript')