Десятичное поле Django не может хранить плавающие числа, которые должны быть в порядке

В проекте django я пытаюсь хранить вычисленное десятичное значение, но это не удается по какой-то странной причине. Моя модель выглядит примерно так:

class FancyModel(models.Model):
  fancy_field = models.DecimalField(max_digits=10, decimal_places=3, null=True, blank=True)

Иногда, довольно часто, он падает при сохранении:

django.db.utils.IntegrityError: CHECK constraint failed: myapp_fancy_model

который, как я выяснил после некоторого копания, был вызван этой валидацией:

django.core.exceptions.ValidationError: {'fancy_field': ['Ensure that there are no more than 2 decimal places.']}

Я сбросил значения фактической модели, и мне кажется, что все в порядке:

{'fancy_field': 3.26 }

Я не могу понять, как это может привести к сбою. Иногда он работает нормально, иногда сбой. Я пытался использовать круглый метод, например:

model_instance.fancy_model = round(floating_value, 2) но все равно не получается.

Вам следует изменить передаваемый параметр decimal_places с 3 на 2

Закомментировав весь код, а затем добавив одну за другой строки обратно, я обнаружил, что ошибка была вызвана вовсе не десятичным полем, а PositiveIntegerField, которое получило отрицательное значение. В model.full_clean() вообще не упоминается PositiveIntegerField, так что это очень странно. Это несколько часов, которые я не смогу вернуть :-/

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