django.db.utils.IntegrityError:NOT NULL约束失败:app.area_id

时间:2017-09-07 05:30:30

标签: python django

当我运行./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)现在提供一次性默认值(将在此列的所有现有行上设置空值)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()。

4 个答案:

答案 0 :(得分:2)

下面的模型试图将区域添加为ForeignKey。由于这个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

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

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

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

答案 1 :(得分:0)

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

否则,即使您修复了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约束,如果您在上一步中填写了数据,那么它应该没问题。

答案 2 :(得分:0)

如上面的答案,[null = True]可用, 我建议另一个[默认=无]也可用

答案 3 :(得分:0)

您可能没有执行makemigrationmigrate

我遇到以下错误:

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

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