如何将Django queryset.values()序列化为json?
我有一个模型,这个模型里有很多字段,但对于这个问题,我只需要其中的3个字段。当我尝试序列化一个 .values
集合时,出现了一个异常:
'dict' 对象没有 '_meta' 属性
这是我的代码:
queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = serializers.serialize('json', queryset, ensure_ascii=False)
6 个回答
25
从对象查询集创建列表:
data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
59
正如其他人所说,Django的序列化工具无法处理ValuesQuerySet。不过,你可以通过使用标准的json.dumps()
来进行序列化,并通过list()
将你的ValuesQuerySet转换成列表。如果你的数据集中包含像小数这样的Django字段,你需要使用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)
41
Django的序列化器只能处理查询集(queryset),而values()
方法返回的不是查询集,而是一个叫ValuesQuerySet
的对象。所以,最好不要使用values()
。相反,你应该在序列化方法中指定你想要使用的字段,像这样:
可以参考这个StackOverflow的问题,里面有个例子。
objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', list(objectQuerySet), fields=('fileName','id'))
与其使用objectQuerySet.values('fileName','id')
,不如在serializers.serialize()
的fields
参数中指定这些字段,像上面那样。