Десятичное поле 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, так что это очень странно. Это несколько часов, которые я не смогу вернуть :-/