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

2024-04-20 11:23:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

'dict' object has no attribute '_meta'

这是我的代码:

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

Tags: no代码模型序列化objectsobjectattributefilter
3条回答

Django序列化程序只能序列化queryset,^{}不返回queryset,而是返回ValuesQuerySet对象。因此,避免使用values()。相反,在序列化方法中指定要在values()中使用的字段,如下所示:

以这个SO question为例

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

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

从objectQuerySet生成列表:

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

正如其他人所说,Django的serializers无法处理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)

相关问题 更多 >