json - 如何在 Django 中对 API 响应强制保留 2 位小数?

标签 json django decimal response

我正在 Django 中制作一个小型 API 服务器。对于我的一个字段,我使用的是小数字段,它负责表示 $ 美元值,因此我希望始终保留 2 位小数。但我很难获得确切的格式。

我正在使用rest_framework,我的基本级别响应被编码为字符串,序列化器如下:

price = serializers.DecimalField(max_digits=10, decimal_places=2, required=True)

string representation

有一个选项可以使用"COERCE_DECIMAL_TO_STRING": False关闭字符串强制。在settings.py中,但随后我遇到了一个问题,即Decimal不可序列化JSON,并且必须使用FloatField,其中我无法指定格式并且最终只有1个小数位:

price = serializers.FloatField(required=True)

float representation

我搜索了在序列化器上设置 FloatField 格式,但没有找到任何相关选项。我相信我还尝试过其他一些序列化器,例如 this一个并没有达到目标,那就是:

如何在 Django 中对 API 响应强制保留 2 位小数?

最佳答案

json不支持Decimal,所以格式化float是唯一的解决方案。您需要使用自定义 json 编码器来指定 json 响应的浮点格式,并从 api 返回格式化的 json。

您的编码器可能看起来像这样:

# Encode Floats as "decimal" with two decimal places
class DecimalEncoder(json.JSONEncoder):
def encode(self, obj):

    if isinstance(obj, dict):
        result = '{'
        for key, value in obj.items():
            if isinstance(value, float):
                encoded_value = format(value, '.2f')
            else:
                encoded_value = json.JSONEncoder.encode(self, value)

            result += f'"{key}": {encoded_value}, '

        result = result[:-2] + '}'
        return result
    return json.JSONEncoder.encode(self, obj)

引用:https://www.geeksforgeeks.org/json-data-types/

关于json - 如何在 Django 中对 API 响应强制保留 2 位小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71453581/

相关文章:

javascript - 如何对 JSON 数据使用 String.prototype 函数?

arrays - 使用 VBA 和 JSON 解析嵌套数组

Django 管理员 : Restrict staff to update

python - 在 Celery 任务中获取生成文件的 URl 的最佳方法是什么

c - 如何仅使用 C 中的整数将十六进制转换为十进制

python - 如何解析 JSON 字符串中转义的双引号

javascript - 如何将 JS 对象转换为有效的 JSON 文件并使用 AJAX 检索它?

django - 在冲突做更新

c - 如何从用户那里获取两个二进制数和运算并给出答案

java - 将二进制数字字符串转换为十进制数...使用递归