我正在 Django 中制作一个小型 API 服务器。对于我的一个字段,我使用的是小数字段,它负责表示 $ 美元值,因此我希望始终保留 2 位小数。但我很难获得确切的格式。
我正在使用rest_framework,我的基本级别响应被编码为字符串,序列化器如下:
price = serializers.DecimalField(max_digits=10, decimal_places=2, required=True)
有一个选项可以使用"COERCE_DECIMAL_TO_STRING": False关闭字符串强制。在settings.py中,但随后我遇到了一个问题,即Decimal不可序列化JSON,并且必须使用FloatField,其中我无法指定格式并且最终只有1个小数位:
price = serializers.FloatField(required=True)
我搜索了在序列化器上设置 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)
关于json - 如何在 Django 中对 API 响应强制保留 2 位小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71453581/