无法在django中对更改的模型应用迁移



我是django的新手。我已经改变了一些字段在我已经创建的Django模型。但是当我尝试对其应用迁移时,它会显示以下消息:

It is impossible to add a non-nullable field 'name' to table_name without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit and manually define a default value in models.py.

虽然我已经从数据库中删除了这个表的数据。我不能设置它的默认值,因为字段必须存储唯一的值。我是否需要删除与该表相关的先前迁移文件?

我已经应用了数据迁移,但再次应用迁移时仍然得到相同的错误:

def add_name_and_teacher(apps, schema_editor):
Student = apps.get_model('app_name', 'Student')
Teacher = apps.get_model('app_name', 'Teacher')
for student in Student.objects.all():
student.name = 'name'
student.teacher = Teacher.objects.get(id=1)
student.save()
class Migration(migrations.Migration):
dependencies = [
('app', '0045_standup_standupupdate'),
]
operations = [
migrations.RunPython(add_name_and_teacher),
]

所以,在您有一个可空字段& name"之前。这意味着可以将null设置为该字段的值。

如果您在该字段(null=False)中添加非空约束,并且运行迁移,您将从数据库中获得完整性错误,因为该表中有行将null设置为该字段的值。

如果您刚刚进行了两次迁移,其中首先添加了一个可空字段,但后来想起它一定不能为空,并且添加了非空约束,那么您应该简单地恢复迁移并删除先前的迁移。这是最干净的解决方案。

您可以通过运行python manage.py migrate <app name> <the migration that you want to keep>

来恢复然后您只需删除新的迁移并再次运行python manage.py makemigrations

如果带有nullable字段的迁移很早就定义了,并且那里已经有数据,并且不可能删除该迁移,则需要弄清楚如何填充该数据。因为您说还有唯一约束,所以您不能只提供默认值,因为它会导致该约束出现问题。

我的建议是编辑迁移文件并添加migrations.RunSQL,在那里您编写自定义SQL代码,将值插入到字段。确保将RunSQL操作放在添加非空约束的操作之前(应该是AlterFieldAddConstraint),因为它们是按顺序运行的。

您也可以使用migrations.RunPython,但我更喜欢RunSQL,因为代码的未来更改可能会破坏您的迁移,这是一个麻烦的处理。

Docs for RunSQL

最新更新