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

How do I enforce 2 decimal places on API response in Django?

我正在用 Django 制作一个小型 API 服务器。对于我的一个字段,我使用了一个负责表示 $ 美元值的小数字段,所以我希望始终有 2 位小数。但我很难找到准确的格式。

我正在使用 rest_framework 并且我的基本级别响应被编码为一个带有以下序列化程序的字符串:

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

string representation

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

price = serializers.FloatField(required=True)

float representation

我搜索了在序列化程序上设置 FloatField 格式,但没有找到任何相关选项。我相信我也尝试了一些其他的序列化器,比如 this 一个但没有达到目标,即:

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

json 不支持十进制,因此格式化浮点数是唯一的解决方案。您需要使用自定义 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/