40

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

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

这是我的代码:

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

5 回答 5

48

正如其他人所说,Django 的序列化程序无法处理 ValuesQuerySet。但是,您可以使用标准进行序列化,并使用json.dumps()将 ValuesQuerySet 转换为列表list()。如果您的集合包含 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)
于 2015-08-13T16:52:43.047 回答
37

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')指定这些字段,如上所示。fieldsserializers.serialize()

于 2011-10-04T16:02:14.813 回答
17

从 objectQuerySet 创建列表:

data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
于 2013-11-29T07:47:08.743 回答
3

我的解决方案,它工作正常

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})
于 2019-12-07T14:59:13.257 回答
2

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

json.dumps([dict(item) for item in SomeModel.objects.all().values('id', 'title')])
于 2015-04-19T00:47:42.097 回答