Django Queryset用于在json中使用

nel*_*ela 15 django

我有以下queryset:

prices = Price.objects.filter(product=product).values_list('price', 'valid_from')
Run Code Online (Sandbox Code Playgroud)

我如何得到"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"]
]}
Run Code Online (Sandbox Code Playgroud)

Vas*_*ogi 39

更好的方法是使用DjangoJSONEncoder.它有支持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)
Run Code Online (Sandbox Code Playgroud)

非常好用.没有跳过用于将单个字段转换为的箍float.

更新:更改了使用builtin json而不是simplejson的答案.

  • 只是注意......从Django 1.5开始,对`django.utils.simplejson`的使用进行了描述.有关详细信息,请参阅[发行说明](https://docs.djangoproject.com/en/dev/releases/1.5/#system-version-of-simplejson-no-longer-used). (6认同)
  • 按照显示的示例:一旦我有`prices_json`,我如何将其传递给模板/ js?以及如何从那里访问它? (2认同)

dge*_*gel 0

from django.utils import simplejson

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

编辑

从你的问题中并不清楚这price是一个DecimalField. 看来您需要从 转换Decimalfloat

simplejson.dumps({'aaData': (float(price), valid_from) for price, valid_from in prices})
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望价格是字符串:

simplejson.dumps({'aaData': (str(price), valid_from) for price, valid_from in prices})
Run Code Online (Sandbox Code Playgroud)