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

Posted

技术标签:

【中文标题】如何将 Django queryset.values() 序列化为 json?【英文标题】:How to serialize Django queryset.values() into json? 【发布时间】:2011-11-30 19:34:53 【问题描述】:

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

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

这是我的代码:

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

【问题讨论】:

您收到什么异常? 'dict' object has no attribute '_meta' 你试过queryset = myModel.objects.filter(foo_icontains=bar).values('foo.f1', 'foo.f2', 'foo.f3')吗? Converting a django ValuesQuerySet to a json object 的可能重复项 【参考方案1】:

Django 序列化器只能序列化查询集,values() 不返回查询集,而是返回 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')

【讨论】:

是的,我知道 .values() 返回一个列表,但是 simplejson.dumps 给了我一个 jsondata is not JSON serializableValuesQuerySet 的形式是:['key1': 'value1', 'key2': 'value2'] 是的,这取决于数据是什么样的,链接答案中的第一个示例就是您要查找的内容。 @bash- 先打电话给list() 是的 list(ValuesQuerySet) 应该返回列表,然后可以用 simplejson 序列化。 @rebus 谢谢,之前没用,因为有一个 DecimalField 不能序列化【参考方案2】:

从 objectQuerySet 创建列表:

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

【讨论】:

这对我来说是最快和最简单的解决方案。我附加了JsonResponse(data_ready_for_json, safe=False),它在 Ajax 调用中完美运行。 我有类似的问题。上述使用 list(queryset) 的解决方案效果很好。谢谢麦克斯! 这就像一个魅力!!!【参考方案3】:

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

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

【讨论】:

【参考方案4】:

正如其他人所说,Django 的serializers 无法处理ValuesQuerySet。但是,您可以使用标准 json.dumps() 进行序列化,并使用 list() 将 ValuesQuerySet 转换为列表。如果您的集合包含诸如 Decimals 等 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)

【讨论】:

最后,这对我有所帮助,我希望将 Queryset 转换为 JSON,然后返回到模板。【参考方案5】:

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

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)

【讨论】:

你为什么要serialize() 然后loads() 只是为了让JsonResponse 再次序列化列表。这是额外的、不必要的工作。

以上是关于如何将 Django queryset.values() 序列化为 json?的主要内容,如果未能解决你的问题,请参考以下文章

Django + Angular:如何将 angularjs $http 数据或参数发送到 django 并在 django 中解释?

如何将 React 连接到 Django?

Django - 如何将 javascript 变量保存到 Django 数据库中? [复制]

Django - 如何将 InMemoryUploadedFile 转换为 ImageField 的 FieldFile?

如何将带有 django 标签的 javascript 代码加载到我的 django 模板中

如何将 css 放在 django 上?