Python 错误:";您试图添加一个不可为空的字段";

Python 错误:";您试图添加一个不可为空的字段";,python,django,Python,Django,我定义了下面的模型并获得 错误:您试图在没有默认值的情况下向videodata添加不可为空的字段“user”;我们不能那样做 models.py class User(Model): userID = models.IntegerField() userName = models.CharField(max_length=40) email = models.EmailField() class Meta: ordering = ['userNam

我定义了下面的模型并获得

错误:
您试图在没有默认值的情况下向videodata添加不可为空的字段“user”;我们不能那样做

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>)
user=models.ForeignKey(user,related\u name='user',default=)

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

python manage.py makemigrations

我不知道为什么,但对我来说是有效的。试试我上面写的不会伤害你的


祝你好运

以下是我为解决同一问题所做的工作

  • 注释视频数据中的外键引用,然后运行makemigrations和migrate
  • 在admins.py中添加模型,并在表中创建一个新条目
  • 现在取消对外键引用的注释,并提供一个默认值=1。运行make migrations和migrate
  • 删除外键字段中的默认值=1
  • 希望这有帮助。 每当您遇到此类错误时,此解决方案都会起作用。

    以下是我所做的:

  • 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
  • 拒绝添加一个为null的foreignKey,因为之前插入到表中的数据的foreignKey将为null,这违背了程序员的意愿
  • 允许将foreignKey从not null更改为null

  • 当您在models.py文件中进行大量更改时(在我的示例中,它与ImageField不可为null的字段相关),有时会出现问题。而不是现场问题。django 2.0.2、python 3.6.4、mysql 5.7.21中的一个解决方案

    • 删除迁移文件夹中的所有文件
      general\u app/migrations/*.py
      ,除了
      \uuuu init\uuuuuu.py
      ,请小心
    您可以检查问题是否已修复,如果未修复:

    • 重复上述步骤,然后
    • 删除您的数据库(例如,在mysql
      mysql>中删除数据库
    • 现在创建一个同名的新数据库
      mysql>createdatabase
    这些步骤解决了我的问题。现在,您可以毫无差错地跑步了:

    $ python manage.py makemigrations
    $ python manage.py migrate
    

    我也遇到了同样的问题:…视频数据的不可空字段“user”

    型号:视频数据

    字段:用户


    只需在模型Videodata的用户字段中再添加一个attr:default=''

    如果您的本地环境中有无意义的数据,则该模型的可能副本效果良好,但如果是生产环境,则必须应用默认值,无论您是否想要。我们可以删除学习项目的迁移。在实时项目中,不建议删除迁移文件。也应该有其他的解决方案。这是一个危险的建议,它会破坏迁移和数据库状态。重置迁移将达到目的,是的(因为您迫使django认为数据库是空的),但它将丢失迁移文件和数据库迁移状态之间的同步。如果在执行此操作之前未进行迁移就更改了模型,那么您还会发现django不再检测到更改,现在留下的模型和一致性错误将在下次迁移尝试时出现。如果你真的想这样做的话,你必须核化数据库并重新创建它。在数据库级别上,一个外键列需要一个默认值是完全有缺陷和错误的。Django迫使您使数据架构出错。也不支持复合外键。真是太遗憾了。我给出了两个解决问题的方法。Django没有强制要求默认值。我可以想到很多情况下,添加默认外键是可以接受的。遗憾的是,这是唯一可行的解决方案。@Feralesfuture我很好奇,你会认为这种解决方案不是“悲哀”的。这里没有问题——如果你只是定义模型,为什么这会是一个问题?如果没有预先存在的数据,FK默认值甚至意味着什么?如果要执行此操作,需要重新创建数据库(使用
    dumpdata
    进行备份),否则将以中断的迁移结束。请注意,在生产环境中,重新创建数据库可能不是一个选项。
    $ python manage.py makemigrations
    $ python manage.py migrate