django serialize queryset.values ​​() en json

Tengo un modelo que tiene muchos campos, sin embargo, para este problema solo necesito 3 de esos campos. Cuando bash serializar un conjunto de .values . Obtengo una excepción

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

Los serializadores Django solo pueden serializar queryset, los values() no devuelven queryset sino el objeto ValuesQuerySet . Por lo tanto, evite utilizar values() . En su lugar, especifique los campos que desea usar en los values() , en el método de serialización de la siguiente manera:

Mira esta pregunta SO por ejemplo

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

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

Como otras personas han dicho, los serializadores de Django no pueden manejar un ValuesQuerySet. Sin embargo, puede serializar usando un json.dumps() estándar y transformando su ValuesQuerySet en una lista usando list() . Si su conjunto incluye campos Django como Decimales, deberá pasar DjangoJSONEncoder . Así:

 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) 

Hacer la lista de objectQuerySet:

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

Simplemente emite para dictar cada elemento y cree json con json.dumps:

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