2011-10-04 111 views
15

我有一个有很多字段的模型,但是对于这个问题,我只需要其中的3个字段。当我尝试序列化.values集我得到一个异常django将queryset.values()序列化为json

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

您收到了什么异常? – Constantinius

+1

''dict'对象没有任何属性'_meta'' –

+0

你用'queryset = myModel.objects.filter(foo_icontains = bar).values('foo.f1','foo.f2','foo。 F3' )'? – Constantinius

回答

17

Django的串行只能序列化的查询集,values()不返回查询集宁ValuesQuerySet对象。所以,请避免使用values()。相反,specifiy要在values()使用领域,在序列化方法如下:

看这个SO question例如

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

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

+1

是的,我知道' .values()'返回一个列表,然而simplejson.dumps给了我一个'jsondata不是JSON serializable','ValuesQuerySet'的形式是:'[{'key1':'value1','key2':'value2 '}]' –

+0

是的,这取决于数据的样子,链接答案的第一个例子就是你要找的。 –

+15

@ bash-先调用'list()'。 –

8

使列表:

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

这对我来说是最快和最简单的解决方案。我追加了'JsonResponse(data_ready_for_json,safe = False)',它在Ajax调用中完美运行。 –

2

只投与dict每一个项目,并创建json.dumps JSON:

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

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