Ошибка: "Вы пытаетесь добавить поле, отличное от нуля"

Я определил ниже модель и получаю

ошибка: 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 с нуля до нуля.