Как заставить Django преобразовать ноль в их стандартном формате DecimalField в обычный формат? - PullRequest
0 голосов
/ 01 октября 2018

У меня очень большой DecimalField в одной из моих моделей.

class Price(models.Model):
    min_value = models.DecimalField(max_digits=50, decimal_places=20)

Таким образом, в общем, это огромное количество, сохраняющее до 20 точек точности.

Кажется, все значения работают,кроме нуля, который есть.Допустим, я сериализовал это поле в объект json, используя следующее:

import json
from django.core.serializers.json import DjangoJSONEncoder

price = Price.objects.get(pk=1)
json = json.loads(json.dumps({
    "min_value" : price.min_value,
}, cls=DjangoJSONEncoder))

Для большинства значений я получаю правильные десятичные числа в строковом формате.Однако, если min_value установлено в 0, я получаю что-то вроде этого: "0E-20"

Я почти уверен, что это означает 0.00000000000000000000, или 20 нулей после точки.Однако я хотел бы получить его в обычном формате или в основном так: "0.00000000000000000000".

Как мне заставить DjangoJSONEncoder сделать это?Обратите внимание, я понимаю, что могу легко сделать это, используя строку «0E-20», взяв число после тире, выполнив цикл for много раз и сгенерировав строку, содержащую только нули.Но есть ли лучшее, более элегантное решение?

1 Ответ

0 голосов
/ 01 октября 2018

Встроенный JJ-кодировщик Django просто преобразует объект Decimal в строку, поэтому вместо этого возникает ошибка stdlib.

>>> from decimal import Decimal
>>> x = Decimal('0.00000000000000000000')
>>> x
Decimal('0E-20')
>>> str(x)
'0E-20'
>>> '{:f}'.format(x)
'0.00000000000000000000'

Из быстрых тестов кажется, что форматирование десятичной дроби в виде числа с плавающей запятой работает, поэтому попробуйтеиспользуя этот пользовательский кодер:

import decimal
from django.core.serializers.json import DjangoJSONEncoder

class CustomJSONEncoder(DjangoJSONEncoder):
    def default(self, o):
        if isinstance(o, decimal.Decimal):
            return '{:f}'.format(o)
        return super().default(o)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...