IntegrityError - сбой ограничения NOT NULL в `models.DecimalField`
Я пытаюсь построить models.DecimalField
, который будет устанавливаться на 50 и иметь диапазон (от 50 до 9000) с шагом 50. Я прочитал, что можно использовать choices
: "Последовательность, состоящая из итераций ровно из двух элементов (например, [(A, B), (A, B) ...]) для использования в качестве вариантов для этого поля. Если варианты заданы, они будут принудительно проверяться моделью, и виджетом формы по умолчанию будет поле выбора с этими вариантами вместо стандартного текстового поля.".
Я понятия не имею, как это исправить. Наверняка ошибка находится в quantity = models.DecimalField
.
Мой код:
from django.db import models
# Create your models here.
class ProductInquirie(models.Model):
email = models.CharField(null=False, blank=False, max_length=120) # max_lenght required
tittle = models.TextField(null=False, blank=False)
quantity = models.DecimalField(
null=True,
blank=True,
decimal_places=0,
max_digits=4,
default=50,
choices=[(i, i) for i in range(50, 9000, 50)]
)
target_price = models.DecimalField(null=False, blank=True, decimal_places=2, max_digits=7) # Why decimal not float: https://docs.python.org/3/library/decimal.html#module-decimal
one_time = models.TextField(default="client didn't provide information, or want constant supply")
constant_need = models.TextField(default="no information")
how_soon = models.TextField(default="no information")
Ожидаемое поведение:
Это должно выглядеть следующим образом:
Разверните, например, так:
...но, без ошибок при сохранении (до сих пор ошибка появляется при нажатии кнопки "сохранить"):)
Ошибка связана с target_price
, с вашим полем quantity
все в порядке (прямо сейчас).
Установив blank=True
, оно не требуется в панели администратора. Однако это поле является обязательным в вашей базе данных, см. null=False
. Это и приводит к возникновению ошибки, которую вы наблюдаете.
target_price = models.DecimalField(null=False, blank=True, decimal_places=2, max_digits=7)
Просто добавьте что-нибудь в это поле, и оно будет работать нормально.
target_price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
Эта ошибка не связана с вашим полем quantity
.
Просто измените ваше поле target_price
, установите его атрибут null
в значение True
, После этого выполните команды python manage.py makemigrations
и python manage.py migrate
. Это устранит ошибку NOT NULL constraint failed.
Ответ уже дан, но я хочу добавить несколько советов, чтобы избежать подобных проблем в будущем. Я только что нашел отличные диаграммы о том, когда использовать null
и blank
в каждой ситуации. Диаграммы взяты из книги "Two Scoops of Django":