django将queryset.values()序列化为json

时间:2011-10-04 15:39:09

标签: python django django-models

我有一个包含许多字段的模型,但是对于这个问题,我只需要其中的3个字段。当我尝试序列化.values集时,我得到一个例外:

  

'dict'对象没有属性'_meta'

这是我的代码:

queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = serializers.serialize('json', queryset, ensure_ascii=False)

5 个答案:

答案 0 :(得分:25)

正如其他人所说,Django的serializers无法处理ValuesQuerySet。但是,您可以使用标准json.dumps()进行序列化,并使用list()将ValuesQuerySet转换为列表。如果您的集合包含Django字段(如Decimals),则需要传入DjangoJSONEncoder。因此:

import json
from django.core.serializers.json import DjangoJSONEncoder

queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = json.dumps(list(queryset), cls=DjangoJSONEncoder)

答案 1 :(得分:22)

Django序列化程序只能序列化查询集,values()不会返回查询集而不是ValuesQuerySet对象。因此,请避免使用values()。而是在serialize方法中指定您希望在values()中使用的字段,如下所示:

请查看此SO question例如

objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', list(objectQuerySet), fields=('fileName','id'))

不使用objectQuerySet.values('fileName','id'),而是使用fields serializers.serialize()参数指定这些字段,如上所示。

答案 2 :(得分:12)

从objectQuerySet创建列表:

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

答案 3 :(得分:2)

只需转换为dict每个项目并使用json.dumps创建json:

json.dumps([dict(item) for item in SomeModel.objects.all().values('id', 'title')])

答案 4 :(得分:0)

我的解决方案,效果很好

from django.core.serializers import serialize
import json

permission_list = Permission.objects.all().order_by('-id')
permission_serialize= json.loads(serialize('json', permission_list))
return JsonResponse({'data': permission_serialize})