2012-05-08 30 views
11

Tôi có queryset sau:Django QuerySet để dict để sử dụng trong json

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

Làm thế nào tôi có thể nhận được giá là "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"] 
]} 

Trả lời

0
from django.utils import simplejson 

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

Sửa

Không rõ câu hỏi của bạn là priceDecimalField. Có vẻ như bạn cần phải chuyển đổi từ Decimal để float:

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

Ngoài ra, nếu bạn muốn giá là một chuỗi:

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

Lỗi: Thập phân ('70 .1700 ') không phải là JSON có thể tuần tự – nelsonvarela

+0

Xem các chỉnh sửa mới trong câu trả lời. – dgel

34

Một cách tiếp cận tốt hơn là sử dụng DjangoJSONEncoder. Nó có hỗ trợ cho 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) 

Rất dễ sử dụng. Không nhảy qua hoops để chuyển đổi các trường riêng lẻ thành float.

Cập nhật: Đã thay đổi câu trả lời để sử dụng json dựng sẵn thay vì simplejson.

+5

Chỉ cần một lưu ý ... việc sử dụng 'django.utils.simplejson' đã được depricated như của Django 1.5. Xem [ghi chú phát hành] (https://docs.djangoproject.com/en/dev/releases/1.5/#system-version-of-simplejson-no-longer-used) để biết thêm thông tin. – Ngenator

+2

theo ví dụ được hiển thị: khi tôi có 'prices_json' làm cách nào để chuyển nó qua mẫu/js? và làm cách nào để truy cập nó từ đó? – Maor

Các vấn đề liên quan