【问题标题】:Error : "You are trying to add a non-nullable field"错误:“您正在尝试添加一个不可为空的字段”
【发布时间】:2015-09-30 04:21:12
【问题描述】:

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

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

我哪里做错了????

【问题讨论】:

标签: python django


【解决方案1】:

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

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

或者有一个默认用户

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

【讨论】:

  • 在数据库级别,需要默认值的外键列是完全有缺陷和错误的。 Django 强迫你把你的数据架构弄错。也不支持复合外键。真是太可惜了。
  • 我给出了两种解决问题的方法。 Django 没有强制要求默认值。我可以想到很多可以接受添加默认外键的情况。
  • 很遗憾这是唯一可行的解​​决方案。
  • @FeralessFuture 我很好奇那种你认为不“悲伤”的解决方案。
  • Noobie here--如果您只是定义模型,为什么会出现问题?如果没有预先存在的数据,那么 FK 默认值意味着什么?
【解决方案2】:

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

python manage.py makemigrations

python manage.py migrate

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

祝你好运!

【讨论】:

  • 如果它适用于具有无意义数据的本地环境,这很有效,但如果它用于生产,则必须应用默认值。
  • 我们可以删除学习项目的迁移。在 Live 项目中,不建议删除迁移文件。也应该是其他一些解决方案。
  • -1。这是一个危险的建议,会破坏您的迁移和数据库状态。重置迁移将达到目的,是的(因为你强迫 django 认为数据库是空的)但它会失去迁移文件和数据库迁移状态之间的同步。如果您在执行此操作之前更改了模型而没有进行迁移,您还会发现 django 不再检测到更改,现在您会看到损坏的模型和一致性错误,准备在下一次迁移尝试时出现。如果你真的想这样做,你必须核对数据库并重新创建它。
【解决方案3】:

这是我为解决相同问题所做的工作

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

希望这会有所帮助。 每当您遇到此类错误时,此解决方案都会起作用。

【讨论】:

    【解决方案4】:

    这是我的工作:

    1. requirement = models.ForeignKey(Requirement) 更改为requirement = models.ForeignKey(Requirement, null=True)
    2. 运行 makemigrations 并迁移
    3. requirement = models.ForeignKey(Requirement, null=True)改回requirement = models.ForeignKey(Requirement)
    4. 运行 makemigrations 并再次迁移。

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

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

    【讨论】:

      【解决方案5】:

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

      • 删除迁移文件夹general_app/migrations/*.py中的所有文件,__init__.py除外,小心。

      您可以检查问题是否已解决,如果没有:

      • 重复上述步骤,然后
      • 删除您的数据库(例如在 mysql 中 mysql&gt; DROP DATABASE &lt;name_db&gt;
      • 现在创建一个具有相同名称mysql&gt; CREATE DATABASE &lt;name_db&gt; 的新文件。

      这些步骤解决了我的问题。现在你可以正常运行了:

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

      【讨论】:

      • 如果您想这样做,您需要重新创建数据库(使用dumpdata 备份),否则您将以失败的迁移结束。请注意,在生产环境中可能无法重新创建数据库。
      【解决方案6】:

      我遇到了同样的问题:...视频数据的不可空字段“用户”...

      型号:视频数据

      字段:用户

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

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        • 2016-05-09
        • 2021-08-25
        • 2020-06-03
        相关资源
        最近更新 更多