错误 : "You are trying to add a non-nullable field"



我在下面定义了模型和获取

错误: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'

我做错了????

正如错误所说,VideoData上的用户字段不允许为空,因此您要么需要给它一个默认用户,要么允许为空。最简单的方法是允许为空。

user = models.ForeignKey(User, related_name='User', null=True)

或者有一个默认用户

user = models.ForeignKey(User, related_name='User', default=<have your default user id here>)

我的OneToOneField遇到了同样的问题。并且,我所做的是删除所有迁移文件(在您的应用程序下的migrations目录下),并运行:

python manage.py makemigrations

python manage.py migrate

我不知道为什么,但它在我的情况下有效。试试我上面写的不会有什么坏处的。

祝你好运!

下面是我修复相同问题的方法

  1. 注释videodata中的外键引用并运行makemigrations&migrate
  2. admins.py中添加模型,并在
  3. 表中添加新条目
  4. 现在取消外键引用的注释并提供一个default=1 .运行make migrations并迁移
  5. 删除外键字段中的default=1

希望这对你有帮助。当你每次遇到这些错误时,这个解决方案都会起作用。

我是这样做的:

  1. change requirement = models.ForeignKey(Requirement) to requirement = models.ForeignKey(Requirement, null=True)
  2. 运行makemigrations&migrate
  3. change back requirement = models.ForeignKey(Requirement, null=True) to requirement = models.ForeignKey(Requirement)
  4. 运行makemigrations&migrate .

我猜django-orm关于foreignKey的规则是:

  1. 允许第一次创建表时foreignKey为null
  2. 拒绝添加为空的foreignKey,因为之前插入到表中的数据的foreignKey将为空,这违背了程序员的意愿
  3. 允许将foreignKey从not null更改为null。

当您在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

我也遇到过同样的问题:…非空字段'user'到videodata…

模型:可视数据

字段:用户

只需在model的user字段中再添加一个attr: Videodata: default= "

问题发生时,我使用TextField()。我发现我以前的迁移文件以某种方式覆盖了新字段。在重新迁移之前清理以前的迁移文件可以解决这个问题。

相关内容

最新更新