Как обеспечить 2 знака после запятой в ответе API в Django?
Я делаю небольшой сервер API на Django. Для одного из моих полей я использую десятичное поле, которое отвечает за представление долларовых значений, поэтому я хотел бы всегда иметь 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 в сериализаторе, но не нашел никакой соответствующей опции. Кажется, я также пробовал некоторые другие сериализаторы, например этот и не достиг цели, а именно:
Как обеспечить 2 знака после запятой в ответе API в Django?
Десятичная дробь не поддерживается json, поэтому единственным решением является форматирование float. Вам необходимо использовать пользовательский json-кодер, который определяет формат float для json-ответа, и отформатированный json возвращается из api.
Ваш кодировщик может выглядеть примерно так:
# 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)