如何将Django queryset.values()序列化为json?

49 投票
6 回答
94653 浏览
提问于 2025-04-17 03:39

我有一个模型,这个模型里有很多字段,但对于这个问题,我只需要其中的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参数中指定这些字段,像上面那样。

撰写回答