Django просит добавить значения по умолчанию

Я новичок в django и столкнулся с проблемой.

Это была моя предыдущая модель.

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

Я добавил некоторые данные в эту модель. После этого я добавил к нему еще одно поле. Теперь моя модель выглядит так..

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
    age = models.IntegerField()

Когда я выполнил команду python manage.py makemigrations, я получил следующую ошибку, которая очевидна.

You are trying to add a non-nullable field 'age' to blog without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

Я не хочу добавлять дефолт, поэтому я удален содержимое таблицы, обращаясь к db.sqlite3

Но снова после запуска python manage.py makemigrations я получаю ту же ошибку. Почему?

Это не ошибка. Вы пытаетесь добавить поле в базу данных, не допуская, чтобы оно было нулевым и не имело начального значения. Если вам не нужны текущие данные в вашей таблице, выберите вариант 1 и введите None в качестве значения по умолчанию, которое будет установлено на данный момент. Он должен мигрировать без проблем.

devdob 02.02.2019 19:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
3 717
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Когда вы добавляете новое поле (то есть столбец) в таблицу базы данных, это поле применяется ко всем строкам в таблице... существующим и любым новым. Если поле не может быть null, то для всех существующих строк необходимо указать какое-то значение.

По умолчанию IntegerField() не может принимать значение NULL. Это объясняет, почему вы получаете предупреждение. У вас есть несколько вариантов:

  • Вы можете выбрать «одноразовое» начальное значение по умолчанию, как предлагает Django. Все существующие строки будут использовать это значение для нового поля.
  • Присвойте собственные значения каждой существующей строке нового поля.
  • Используйте аргументы blank и null в поле вашей модели, чтобы поле могло принимать нулевые значения.

Для последнего варианта вы должны сделать это так:

models.IntegerField(blank=True, null=True)

Но это может быть не лучшим выбором в зависимости от вашего варианта использования. Если значения, допускающие значение NULL, не имеют смысла для вашего поля, я бы не стал заставлять поле поддерживать значения NULL.

age = models.IntegerField(null=True)

Поля моделей Django по умолчанию имеют значение null, равное true.

Ответ принят как подходящий

Даже если вы удалили таблицу, любые изменения в вашей модели Django всегда будут ссылаться на предыдущую миграцию этой модели, поэтому вам все равно потребуется установить значение по умолчанию. Если вы все еще находитесь в разработке, вы можете удалить миграции для этой модели, а затем снова выполнить миграции. Но это ужасная практика, и вы никогда не должны делать этого, если вы сознательно не раздавливаете свои модели, лучший способ - сделать то, что говорит вам Джанго, и установить значение по умолчанию. В любом случае это поможет в долгосрочной перспективе с обработкой ошибок.

Другие ответы касаются того, как достаточно хорошо установить значения по умолчанию.

Как вы можете решить это:

  • Удалите таблицу Blog из базы данных.
  • Удалите папку миграции из приложения, содержащего модель блога.
  • Удалить все данные из таблицы django_migrations.
  • Теперь запустите миграция, а затем команду мигрировать.

Надеюсь, это решит вашу проблему.

Делайте то, что говорит вам Django, затем вы можете удалить атрибут default, если он вам не нужен. Но это хорошая практика, чтобы сохранить его в любом случае

Другие вопросы по теме