Ошибка: "Вы пытаетесь добавить поле, отличное от нуля"
Я определил ниже модель и получаю
ошибка: You are trying to add a non-nullable field 'user' to videodata without a default; we can't do that
models.py
class User(Model):
userID = models.IntegerField()
userName = models.CharField(max_length=40)
email = models.EmailField()
class Meta:
ordering = ['userName']
verbose_name = 'User MetaData'
verbose_name_plural = 'Users MetaData'
def __unicode__(self):
return str(self.userName)
class VideoData(Model):
video = models.CharField(max_length=40)
time = models.IntegerField()
user = models.ForeignKey(User, related_name='User')
class Meta:
verbose_name = 'User_Video MetaData'
Где я делаю неправильно????
Ответы
Ответ 1
Как говорится в ошибке, поле пользователя в VideoData не допускает нулевое значение, поэтому вам нужно либо предоставить его пользователю по умолчанию, либо разрешить null. Самый простой способ - разрешить null.
user = models.ForeignKey(User, related_name='User', null=True)
или пользователь по умолчанию
user = models.ForeignKey(User, related_name='User', default=<have your default user id here>)
Ответ 2
Я столкнулся с той же проблемой с моим OneToOneField. И я сделал это, чтобы удалить все файлы миграции (которые находятся под каталогом migrations
в вашем приложении) и выполнил:
python manage.py makemigrations
и
python manage.py migrate
Я не знаю почему, но это сработало в моем случае. Это не помешает вам попробовать то, что я написал выше.
Удачи!
Ответ 3
Вот что я сделал, чтобы исправить ту же проблему
- Прокомментируйте ссылку внешнего ключа в видеоданных и запустите makemigrations и выполните миграцию
- Добавьте модель в admins.py и создайте новую запись в таблице
- Теперь раскомментируйте ссылку на внешний ключ и укажите default = 1.Run выполнить миграцию и перенести
- Удалить поле по умолчанию = 1 в поле внешнего ключа.
Надеюсь, это поможет.
Это решение будет работать каждый раз, когда вы сталкиваетесь с такими ошибками.
Ответ 4
Ответ, который вы приняли, будет работать, но это неправильное решение, так как вы сможете хранить объекты без отношения к другому объекту, и я предполагаю, что вы этого не хотите.
Когда вы меняете базу данных или удаляете ее, не удаляя файлы миграции, django поймет, что есть заполненная база данных, и что вы уже создали обе модели, поэтому, если вы добавите пустое обязательное поле к уже созданному объекту, ошибка. Правильным решением будет удаление файлов миграции (или изменение имени в папке только для обеспечения безопасности) и после запуска:
python manage.py makemigrations
python manage.py migrate
Отредактировано: перед запуском mogrations сначала удалите базу данных или таблицы.
Если вы допустили ошибку при использовании null=True
или значения по умолчанию, и вы не хотите очищать свою базу данных, у вас есть другие параметры в зависимости от состояния вашей базы данных:
Первый случай:
Если каждый объект VideoData уже имеет отношение к пользователю, вы можете просто удалить null=True
или default=""
и запустить:
python manage.py makemigrations
и после:
python manage.py migrate
Второй случай:
Если некоторые поля пользователя являются нулевыми или имеют значение по умолчанию, которое не является пользователем, тогда вам нужно будет запустить собственный SQL, чтобы установить каждое поле в пользовательский_файл по умолчанию перед удалением null=True
или the default=""
и выполнить миграцию.
Однако я предполагаю, что первого случая будет достаточно четыре, если вы не хотите удалять свою базу данных, я полагаю, что вы заполнили поле пользователя нужными данными. Я просто хотел дать вариант, если у кого-то есть такая ситуация.
Ответ 5
Большинство подобных ситуаций не являются проблемой не добавления файлов в модель (использование makemigrations и migrate)
Но из-за неправильных ошибок в типе моделей и форм полей (ЗДЕСЬ это произошло из-за ошибки синтаксиса внешнего ключа)
Итак, сначала обратитесь: https://www.djangoproject.com/
Здесь могут быть и другие причины:
Иногда база данных заполняется, и она принимает только значение Non Nullable Value
(Эта ошибка довольно часто встречается в новых версиях django
SO также устанавливает условие (null == True) в вашей модели
Ответ 6
Проблема иногда возникает, когда вы делаете много изменений в файле models.py(в моем случае это было связано с полем с неэлементным значением ImageField). На самом деле это не полевые проблемы. Одно решение в django 2.0.2, python 3.6.4, mysql 5.7.21
- Удалите все файлы внутри папки миграций
general_app/migrations/*.py
, кроме __init__.py
, будьте осторожны.
Вы можете проверить, исправлена ли проблема, если нет:
- Повторите вышеуказанный шаг и
- Удалите свою базу данных (например, в mysql
mysql> DROP DATABASE <name_db>
)
- Теперь создайте новый с тем же именем
mysql> CREATE DATABASE <name_db>
.
Эти шаги устранили проблему в моем случае. Теперь вы можете бежать без ошибок:
$ python manage.py makemigrations
$ python manage.py migrate
Ответ 7
Вот что я делаю:
- изменить
requirement = models.ForeignKey(Requirement)
на requirement = models.ForeignKey(Requirement, null=True)
- запустить makemigrations и выполнить миграцию
- изменить
requirement = models.ForeignKey(Requirement, null=True)
на requirement = models.ForeignKey(Requirement)
- запустить makemigrations и снова выполнить миграцию.
Я предполагаю, что правило django-orm о foreignKey:
- Разрешить foreignKey быть null при первом создании таблицы
- отклонить, чтобы добавить foreignKey, который является нулевым, потому что foreignKey данных вставляет в таблицу before будет null, что против программиста будет
- позволяют изменять значение foreignKey с нуля до нуля.