2011-10-04 24 views
15

Tengo un modelo que tiene muchos campos, sin embargo, para este problema solo necesito 3 de esos campos. Cuando intento para serializar un conjunto .values consigo una excepcióndjango serialize queryset.values ​​() en json

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

¿Qué excepción estás recibiendo? – Constantinius

+1

el objeto 'dict' no tiene el atributo '_meta'' –

+0

lo has intentado con 'queryset = myModel.objects.filter (foo_icontains = bar) .values ​​(' foo.f1 ',' foo.f2 ',' foo. f3 ') '? – Constantinius

Respuesta

17

serializadores Django sólo pueden serializar queryset, values() no vuelve queryset en lugar ValuesQuerySet objeto. Por lo tanto, evite usar values(). Más bien, specifiy los campos que desea utilizar en values(), en el método de serialización de la siguiente manera:

Mira esta SO question por ejemplo

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

En lugar de utilizar objectQuerySet.values('fileName','id'), especifique los campos usando el parámetro fields de serializers.serialize() como se muestra arriba.

+1

Sí, soy consciente de que ' .values ​​() 'devuelve una lista, sin embargo simplejson.dumps me da un' jsondata no es JSON serializable', el 'ValuesQuerySet' está en la forma:' [{'key1': 'value1', 'key2': 'value2 '}] ' –

+0

Sí, depende de cómo se vean los datos, el primer ejemplo de la respuesta vinculada es lo que está buscando. –

+15

@ bash- simplemente llame 'list()' primero. –

8

lista Marca, de objectQuerySet:

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

Esta fue la solución más rápida y simple para mí. Agregué 'JsonResponse (data_ready_for_json, safe = False)' y funcionó perfectamente en una llamada Ajax. –

2

Sólo echó a dict cada artículo y crear JSON con json.dumps:

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

Como otras personas han dicho, de Django serializers no puede manejar una ValuesQuerySet. Sin embargo, puede serializar utilizando un estándar json.dumps() y transformar su ValuesQuerySet a una lista usando list(). Si su conjunto incluye campos de Django como Decimales, deberá pasar DjangoJSONEncoder. Por lo tanto:

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)