Как обеспечить 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)

Ссылка: https://www.geeksforgeeks.org/json-data-types/

Вернуться на верх