错误:"您正在尝试添加不可为空的字段"

Nar*_*esh 18 python django

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

错误: 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'
Run Code Online (Sandbox Code Playgroud)

我做错了哪里????

wob*_*col 23

如错误所示,VideoData上的用户字段不允许空值,因此您需要为其提供默认用户或允许空值.最简单的方法是允许空值.

user = models.ForeignKey(User, related_name='User', null=True)
Run Code Online (Sandbox Code Playgroud)

或者有一个默认用户

user = models.ForeignKey(User, related_name='User', default=<have your default user id here>)
Run Code Online (Sandbox Code Playgroud)

  • 在数据库级别,需要默认值的外键列是完全有缺陷和错误的。Django 强迫你让你的数据架构出错。也不支持复合外键。真是该死的耻辱。 (5认同)
  • 我就如何解决问题给出了两种选择。Django 不强制要求默认值。我可以想到很多可以添加默认外键的情况。 (2认同)

bta*_*aek 14

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

python manage.py makemigrations
Run Code Online (Sandbox Code Playgroud)

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但它在我的情况下起作用.尝试上面写的内容不会对你造成伤害.

祝好运!

  • -1。这是危险的建议,会破坏您的迁移和数据库状态。重置迁移将实现目的,是的(因为你迫使 django 认为数据库是空的),但它将失去迁移文件和数据库迁移状态之间的同步。如果您在执行此操作之前更改了模型而没有迁移,您还会发现 django 不再检测到更改,现在您将面临损坏的模型和一致性错误,准备在下一次迁移尝试时出现。如果你真的想这样做,你必须破坏数据库并重新创建它。 (4认同)
  • 如果它适用于您的本地环境,并且没有无意义的数据,那么这种方法很有效,但如果是用于生产,则必须应用默认情况. (3认同)