如何在 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)
我正在用 Django 制作一个小型 API 服务器。对于我的一个字段,我使用了一个负责表示 $ 美元值的小数字段,所以我希望始终有 2 位小数。但我很难找到准确的格式。
我正在使用 rest_framework 并且我的基本级别响应被编码为一个带有以下序列化程序的字符串:
price = serializers.DecimalField(max_digits=10, decimal_places=2, required=True)
string representation
settings.py 中有一个选项可以使用
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)