繁体   English   中英

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

[英]django.db.utils.IntegrityError: NOT NULL constraint failed: app.area_id

当我运行./manage.py migrate ,会发生错误django.db.utils.IntegrityError: NOT NULL constraint failed: app.area_id 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')

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() 。

在下面的模型中,您尝试将区域添加为外键。 由于这个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字段将为空。 您现在可以为新行添加此字段。

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

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

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

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

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

完成此操作后,您可以选择编写数据迁移脚本来填充缺失的area属性。 您可以在文档中阅读更多信息。

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

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

area = models.ForeignKey('Area')

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

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

您可能还没有执行makemigrationmigrate

我面临以下错误:

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

但是在makemigrationmigrate ,它就消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM