我在Apache2上运行了一个Django实例。我的一个网页是对Django进行Ajax回调。
大多数情况下,它运行良好,但有时由于我无法确定的原因,它停止使用Django的以下错误:
十进制('12000')不是JSON可序列化的
一旦我收到此错误,它就会永远停止工作。我知道的唯一解决方案是重新启动Apache。
Python / Django没有改变,也没有改变Ajax调用所请求的数据。当我在Django Web服务器上运行代码时,我从未遇到过这个问题。
views.py:
@login_required
def KPIInitTable(request):
kpi_values = [ob.as_json() for ob in KPI.objects.all()]
data = {'table_data' : kpi_values,
'colHeaders': ['KPI', 'CityCategory', 'Type','January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
'rowHeaders': 0,
'KPIList': settings.TST_KPILIST,
'TypeList': settings.TST_TYPELIST,
'CityCategoryList': settings.TST_CITYCATEGORYLIST
}
response = HttpResponse(dumps(data, cls=DjangoJSONEncoder), mimetype='application/json')
response['Cache-Control'] = 'no-cache'
return response
Models.py:
from django.db import models
class KPI(models.Model):
name = models.CharField(max_length=50, null=True)
CityCategory = models.CharField(max_length=50, null=True)
type = models.CharField(max_length=20, null=True)
Jan = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Feb = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Mar = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Apr = models.DecimalField( max_digits=15, decimal_places=2, null=True)
May = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Jun = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Jul = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Aug = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Sep = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Oct = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Nov = models.DecimalField( max_digits=15, decimal_places=2, null=True)
Dec = models.DecimalField( max_digits=15, decimal_places=2, null=True)
uniqueFields = ['name','CityCategory','type']
class Meta:
permissions = (
("access_tst", "Access target setting tool."),
("run_tst", "Compute new targets."),
("validate_tst", "Validate and load new targets."),
)
def as_json(self):
return {0: self.name, 1: self.CityCategory, 2: self.type, 3: self.Jan,4: self.Feb,5: self.Mar,6: self.Apr,7: self.May,8: self.Jun,9: self.Jul,10: self.Aug,11: self.Sep,12: self.Oct,13: self.Nov,14: self.Dec}
这个值“12000”确实是数据库(SQLite)重新编译的第一行的第一个十进制值。
有什么想法吗?
THX,
答案 0 :(得分:1)
解决问题的一种方法是更改to_json()
方法并将所有小数字段值转换为str
:
def as_json(self):
return {0: self.name,
1: self.CityCategory,
2: self.type,
3: str(self.Jan),
4: str(self.Feb),
...
14: str(self.Dec)}