django将queryset.values()序列化为json

bas*_*sh- 26 python django django-models

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

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

And*_*ori 30

正如其他人所说,Django的序列化程序无法处理ValuesQuerySet.但是,您可以使用标准进行序列化,并使用json.dumps()将ValuesQuerySet转换为列表list().如果你的set包含Django字段,比如Decimals,你需要传入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)
Run Code Online (Sandbox Code Playgroud)


Dav*_*cic 24

Django序列化程序只能序列化查询集,values()不返回查询集而是返回ValuesQuerySet对象.所以,避免使用values().而是values()在serialize方法中指定您希望使用的字段,如下所示:

以这个SO问题为例

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

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

  • @bash-首先调用`list()`. (19认同)
  • 是的,我知道 `.values()` 返回一个列表,但是 simplejson.dumps 给了我一个 `jsondata 不是 JSON 可序列化的`,`ValuesQuerySet` 的形式为:`[{'key1': 'value1', 'key2': 'value2'}]` (2认同)
  • 是`list(ValuesQuerySet)`应该返回列表,然后可以使用`simplejson`序列化. (2认同)

Max*_*Max 12

从objectQuerySet创建列表:

data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是最快、最简单的解决方案。我附加了 `JsonResponse(data_ready_for_json, safe=False)` 并且它在 Ajax 调用中完美运行。 (2认同)
  • 我有类似的问题。上面使用 list(queryset) 的解决方案效果很好。谢谢马克斯! (2认同)

Ash*_*gar 6

我的解决方案,效果很好

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})
Run Code Online (Sandbox Code Playgroud)