我正在尝试使用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
谢谢!
答案 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')