当我运行./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()。
答案 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)
您可能没有执行makemigration
和migrate
。
我遇到以下错误:
django.db.utils.IntegrityError:NOT NULL约束失败: adminapp_responses.created_by_id
但是在makemigration
和migrate
之后,它消失了。