将django的ValuesQuerySet转换为json对象

19 投票
4 回答
23887 浏览
提问于 2025-04-16 20:58

我正在尝试在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 个回答

14

我在使用上面提到的 list() 方法时,持续遇到一个错误,提示 dict 对象没有 _meta 这个属性。不过,我找到了一段可以解决这个问题的代码,链接在这里:这段代码

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

首先把ValuesQuerySet转换成一个列表:

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

list(query_set)

按照ars的建议去掉values这个调用,会导致管理器从表中拉取所有的列,而不仅仅是你需要的那两列。

18

试试通过使用 QuerySet 的 serialize 方法来对你的值列表进行字段的子集选择,具体可以参考这个链接

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

撰写回答