将django ValuesQuerySet转换为json对象

Kar*_*ran 17 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')
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

谢谢 !

Aar*_*ron 34

首先将ValuesQuerySet转换为列表:

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

list(query_set)
Run Code Online (Sandbox Code Playgroud)

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

  • 很棒的答案.工作得很漂亮. (3认同)
  • 它在我的环境中不起作用(Python 3.4,Django 1.8.3). (2认同)

ars*_*ars 14

尝试使用QuerySet 通过方法对值列表中的字段进行子集化serialize:

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

  • 不理想,因为当只需要两个字段时,查询将所有列数据拉出. (15认同)

7wo*_*ers 10

使用上述方法时,我继续得到一个dict没有属性_meta错误的对象list().但是我发现这个片段可以解决这个问题

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)
Run Code Online (Sandbox Code Playgroud)

  • 模块 `simplejson` 在 Django 1.5 中被[删除](https://docs.djangoproject.com/en/1.7/releases/1.5/#django-utils-simplejson)。另一种方法是简单地`import json`,然后使用`json.dumps(data_dict)`,答案就如预期的那样。 (2认同)