Python Django-Decimal类型的对象不可JSON序列化,无法转换为视图中的模型数据

Python Django-Decimal类型的对象不可JSON序列化,无法转换为视图中的模型数据,python,django,django-models,django-views,decimal,Python,Django,Django Models,Django Views,Decimal,我需要获取视图中数据的json版本。为此,我尝试获取数据的JSON转储。 使用json.dumps(resultdct)会抛出错误 从模型中尝试不同结果的错误被注释掉以供参考。 dict(zip())选项与我想要的最接近。resultdct为我提供了一个可以使用的JSON(键、值)配对。但是它给了我一个包含“DecimalField”的结果数据错误。有没有一种方法可以在返回的数据上保留小数点而不出错?这似乎是Django支持的一件简单的事情,所以我不确定我是否遗漏了什么 另外,我是否可以直接将

我需要获取视图中数据的json版本。为此,我尝试获取数据的JSON转储。 使用
json.dumps(resultdct)
会抛出错误

从模型中尝试不同结果的错误被注释掉以供参考。
dict(zip())
选项与我想要的最接近。resultdct为我提供了一个可以使用的JSON(键、值)配对。但是它给了我一个包含“
DecimalField
”的结果数据错误。有没有一种方法可以在返回的数据上保留小数点而不出错?这似乎是Django支持的一件简单的事情,所以我不确定我是否遗漏了什么

另外,我是否可以直接将ResultModel处理到视图中的json转储中,而不是设置两个结果集(数据相同,格式不同)从模型发送回视图

更新:我发现了这一点。因为这是一个存储过程/直接查询,所以当我们使用
dict(zip(列,行))
,应使用db查询中的列名。然后,为了获得JSON,执行一个
JSON.dumps(myDict)

替代解决方案: 在模型中,
为行中的行返回[ResultModel(*row)]

观点:

rows = fetchall()
resultList = []
resultModel = []
resultDict = []
for row in rows:
    resultModel.append(ResultModel(*row)) # Object of type ResultModel is not JSON serializable
    resultList.append(list(row)) # Rows returned by pyodbc are not JSON serializable
    resultDict.append(dict(zip(columns, row))) # Object of type Decimal is not JSON serializable
但这也给了我模型名。是否有办法只返回每个列表的.fields部分

[ 字段:{Column1:“1”,Column2:“2”}, 模型:“app_name.resultmodel”, pk:“
]尝试扩展JSONEncoder

results = Get-model
json = serializers.serialize("python", results, fields=('Column1', 'Column2')

实际上,JSON没有十进制类型,因此JSON.dumps不知道如何处理您的DecimalField。但Django确实支持这一点,它的序列化程序正是为了实现这一点。或者,使用Django REST框架,它有更多可定制的框架。我通过使用Django.core.serializers.json导入DjangoJSONEncoder的-
,然后使用
json.dumps(data,cls=DjangoJSONEncoder)
来实现这一点,但我必须返回结果模型和json版本。我需要两者,有没有一种方法可以发送一个,然后根据需要在视图/模板中转换它?还有,序列化程序应该与views.py分离吗?我对使用Django非常陌生,所以想尝试使用最佳实践来编辑我的问题。我创建了两个对象,并从模型发送到视图中。是否有方法显示json对象/列字典中的模型数据(ResultModel(row))<代码>{'col1':'val1','col2':'val2'}{'col1':'res2','col2':'row2'}
但这不是对象的数组/列表,因此循环不会直接在模板中工作。尝试使用
json.loads(jsonData)
也不起作用。
import json
from decimal import Decimal

class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Decimal):
            return float(obj)
        return json.JSONEncoder.default(self, obj)

# Usage:
d = Decimal("42.5")
json.dumps(d, cls=DecimalEncoder)