Django DecimalField пропускающие конечные нули - PullRequest
0 голосов
/ 04 июня 2018

Моя форма содержит DecimalField с атрибутами max_digits=8, decimal_places=2, validators=[MinValueValidator(0)], blank=True, null=True.

На мой взгляд, я получаю модель, возвращенную формой:

my_model = form.save(False)

# Do stuff with returned model
...

my_model.save()

Когда я захожу на доступзначение DecimalField, price я получаю без конечных нулей.Скажем, значение, введенное в поле формы, было 50:

print(my_model.price)
# Prints 50

Но когда я получаю модель с нуля, а затем извлекаю цену, я получаю ее с конечными нулями.

my_model = MyModel.objects.get(id=my_model.id)
print(my_model.price)
# Prints 50.00

Мне просто интересно, почему это так.

1 Ответ

0 голосов
/ 04 июня 2018

Что ж, одна из проблем с плавающей запятой заключается в том, что они обычно не могут представлять множество десятичных значений.Например, 0.3 не может быть представлен точно.

С другой стороны, есть Python типа с именем Decimal, который не работает со спецификациями IEEE-754 с плавающей запятой.Но, отформатировав его как поток десятичных цифр.В результате он может правильно представлять десятичные числа и правильно выполнять вычисления (но ему будет сложно хранить числа в компактном виде). ​​

Поскольку базы данных обычно также используют такое представлениеТаким образом, Django использует Decimal для предотвращения потери данных при чтении или записи в базу данных.Это Decimal содержит точность и печатает числа типа 50 с их точностью (поэтому 50.00).

Однако Django стремится принимать все виды числовых значений, включая int s, float s и т. д. В этом случае значения преобразуются в десятичное представление при записи их в базу данных.

Таким образом, в случае, если вы, например, присваиваете int атрибуту экземпляра модели, тогдаэтот атрибут будет иметь тип int (ну, в основном это способ, которым вы назначаете атрибут для объекта Python).Если вы затем сохраните его в базе данных, Django будет сериализовать его как десятичное число, и оно будет сохранено в базе данных.Если вы позже извлечете модель, у вас в памяти будет модель с атрибутом as Decimal, которая хранит число с указанной точностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...