十进制('12000')不是JSON可序列化的

时间:2014-04-28 14:29:58

标签: ajax json django serialization

我在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,

1 个答案:

答案 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)}