2012-05-08 14 views
11

Tengo el siguiente conjunto de consultas:Django queryset a dict para su uso en JSON

prices = Price.objects.filter(product=product).values_list('price', 'valid_from') 

¿Cómo puedo obtener los precios como "json"

{"aaData": [ 
    ["70.1700", "2007-01-01"], # price, valid_form 
    ["72.6500", "2008-01-01"], # price, valid_form 
    ["74.5500", "2009-01-01"], # price, valid_form 
    ["76.6500", "2010-01-01"] 
]} 

Respuesta

0
from django.utils import simplejson 

prices = Price.objects.filter(product=product).values_list('price', 'valid_from') 
simplejson.dumps({'aaData': prices}) 

Editar

No quedó claro por su pregunta que price es un DecimalField. Parece que lo que se necesita para convertir de Decimal a float:

simplejson.dumps({'aaData': (float(price), valid_from) for price, valid_from in prices}) 

Alternativamente, si desea que el precio sea una cadena:

simplejson.dumps({'aaData': (str(price), valid_from) for price, valid_from in prices}) 
+0

Error: Decimal ('70 .1700 ') no es JSON serializable – nelsonvarela

+0

Ver nuevas ediciones en la respuesta. – dgel

34

Un mejor enfoque es utilizar DjangoJSONEncoder. Tiene soporte para Decimal.

import json 
from django.core.serializers.json import DjangoJSONEncoder 

prices = Price.objects.filter(product=product).values_list('price', 'valid_from') 

prices_json = json.dumps(list(prices), cls=DjangoJSONEncoder) 

Muy fácil de usar. No salta a través de aros para convertir campos individuales al float.

Actualización: Se ha cambiado la respuesta para utilizar el json incorporado en lugar de simplejson.

+5

Solo una nota ... el uso de 'django.utils.simplejson' ha sido privado de Django 1.5. Consulte las [notas de la versión] (https://docs.djangoproject.com/en/dev/releases/1.5/#system-version-of-simplejson-no-longer-used) para obtener más información. – Ngenator

+2

siguiendo el ejemplo que se muestra: una vez que tengo 'prices_json' ¿cómo se lo paso a la plantilla/js? y ¿cómo puedo acceder desde allí? – Maor

Cuestiones relacionadas