【问题标题】:django.db.utils.IntegrityError: NOT NULL constraint failed: app.area_iddjango.db.utils.IntegrityError:NOT NULL 约束失败:app.area_id
【发布时间】:2017-09-07 05:30:29
【问题描述】:

当我运行 ./manage.py migrate 时,会发生错误 django.db.utils.IntegrityError: NOT NULL constraint failed: app.area_idmodels.py

class Area(models.Model):
    name = models.CharField(max_length=20, verbose_name='area', null=True)

class User(models.Model):
    name = models.CharField(max_length=200,null=True)
    age = models.CharField(max_length=200,null=True)
    area = models.ForeignKey('Area', default="")

class Prefecture(models.Model):
    name = models.CharField(max_length=20, verbose_name='city')
    area = models.ForeignKey('Area')

class City(models.Model):
    name = models.CharField(max_length=20, verbose_name='region')
            prefecture = models.ForeignKey('Prefecture')

class Price(models.Model):
    name = models.CharField(max_length=20, verbose_name='price')
            PRICE_RANGE = (
                ('a', 'under500'),
                ('b', '500-1000'),
                ('c', 'upper1000'),
            )
    price_range = models.CharField(max_length=1, choices=PRICE_RANGE)
    city = models.ForeignKey('City')

当我写area = models.ForeignKey('Area')时,我得到了一个错误 您正在尝试在没有默认值的情况下向事务添加不可为空的字段“区域”;我们不能这样做(数据库需要一些东西来填充现有的行)。请选择一个修复:1) 现在提供一次性默认值(将在所有现有行上设置此列的 null 值)2) 退出,让我在 models.py 中添加一个默认值。 怎么了?我该如何解决这个问题?

现在 models.py 是

class Area(models.Model):
    name = models.CharField(max_length=20, verbose_name='area', null=True)

class User(models.Model):
    name = models.CharField(max_length=200,null=True)
    age = models.CharField(max_length=200,null=True)
    area = models.ForeignKey('Area', default="")

class Prefecture(models.Model):
    name = models.CharField(max_length=20, verbose_name='city')
    area = models.ForeignKey('Area', null=True, blank=True)

class City(models.Model):
    name = models.CharField(max_length=20, verbose_name='region')
            prefecture = models.ForeignKey('Prefecture', null=True, blank=True)

class Price(models.Model):
    name = models.CharField(max_length=20, verbose_name='price')
            PRICE_RANGE = (
                ('a', 'under500'),
                ('b', '500-1000'),
                ('c', 'upper1000'),
            )
    price_range = models.CharField(max_length=1, choices=PRICE_RANGE)
    city = models.ForeignKey('City', null=True, blank=True)

我也遇到了同样的错误。我已经尝试过 cache.clear() 。

【问题讨论】:

    标签: python django


    【解决方案1】:

    在下面的模型中,您尝试将区域添加为外键。由于这个Prefecture 表已经有一些数据,Django 不知道在现有行的区域字段中添加什么。

    class Prefecture(models.Model):
        name = models.CharField(max_length=20, verbose_name='city')
        area = models.ForeignKey('Area') # non null-able field Django does
                                         # not know what to add
    

    简单的解决方案。提供默认值或添加 null

    class Prefecture(models.Model):
            name = models.CharField(max_length=20, verbose_name='city')
            area = models.ForeignKey('Area', null=True)
    

    注意:对于Prefecture 中的所有现有行,现在area 字段将为空。您现在可以为新行添加此字段。

    【讨论】:

    • thx,你的 cmets。我试过你的代码,但我得到了同样的错误。我更新了我的问题,如果你知道什么请帮助我。
    • 在县模型中你还有area = models.ForeignKey('Area')你必须把它改成这个area = models.ForeignKey('Area', null=True, blank=True)@user8504021
    • 我试过你的代码,但我得到了同样的错误。我更新了我的问题代码,如果你发现仍然有错误,请告诉我。
    • 我现在只能想到一个错误在User 模型中将此area = models.ForeignKey('Area', default="") 更改为area = models.ForeignKey('Area', null=True, blank=True) 如果它仍然不起作用,请通过删除数据库尝试重新迁移
    【解决方案2】:

    您首先需要删除之前生成的迁移文件。

    否则,即使您修复了models.py,您仍会收到同样的错误,因为./manage.py migrate 将继续尝试应用之前的迁移。

    删除之前生成的迁移文件后,使用以下命令:

    area = models.ForeignKey('Area', blank=True, null=True)
    

    这将使area 属性成为可选属性,您将能够生成新的迁移文件并继续使用./manage.py migrate

    完成后,您可以选择编写一个数据迁移脚本来填充缺少的area 属性。您可以在documentation 中了解更多信息。

    您也可以为现有数据手动填写此属性,而不是编写迁移脚本(例如,直接购买更新数据库或使用 django-admin)。

    确保所有数据都填写了area 属性后,您可以进行最终更改:

    area = models.ForeignKey('Area')
    

    当您应用此迁移时,您只需在数据库中的该字段中添加一个 NOT NULL 约束,如果您在上一步中填写数据应该就可以了。

    【讨论】:

    • 删除之前的(“未提交”)迁移文件是关键!
    • 如果您想为数据库中已在该字段添加到模型之前创建的项目分配默认值,则可以指定default=someUserId 而不是null=True
    【解决方案3】:

    如上述答案,[null = True] 可用, 我推荐另一个 [default = None] 也可用

    【讨论】:

      【解决方案4】:

      你可能没有执行makemigrationmigrate

      我遇到以下错误:

      django.db.utils.IntegrityError: NOT NULL 约束失败: adminapp_responses.created_by_id

      但在makemigrationmigrate 之后,它就消失了。

      【讨论】:

        猜你喜欢
        • 2020-06-08
        • 2020-07-04
        • 2018-12-24
        • 2021-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        相关资源
        最近更新 更多