添加唯一字段的迁移
应用向具有现有行的表添加唯一不可为空字段的“普通”迁移将引发错误,因为用于填充现有行的值仅生成一次,从而破坏了唯一约束。
因此,应采取以下步骤。UUIDField在此示例中,我们将添加一个具有默认值的不可为空值。根据您的需要修改相应的字段。
default=uuid.uuid4使用和参数在模型上添加字段unique=True (为要添加的字段类型选择适当的默认值)。
1.运行makemigrations命令。这应该生成带有AddField操作的迁移。
2.运行两次makemigrations myapp --empty,为同一个应用生成两个空的迁移文件 。在下面的示例中,我们已重命名迁移文件以赋予它们有意义的名称。
3.将AddField操作从自动生成的迁移(三个新文件中的第一个)复制到最后一个迁移,更改AddField为 并添加和AlterField的导入。例如:uuidmodels
# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
('myapp', '0005_populate_uuid_values'),
]
operations = [
migrations.AlterField(
model_name='mymodel',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, unique=True),
),
]
4.编辑第一个迁移文件。更改unique=True为null=True,这将创建中间空字段并推迟创建唯一约束,直到我们在所有行上填充唯一值。
在文件0004_add_uuid_field.py
class Migration(migrations.Migration):
dependencies = [
('myapp', '0003_auto_20150129_1705'),
]
operations = [
migrations.AddField(
model_name='mymodel',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, null=True),
),
]
5.在第一个空的迁移文件中,添加一个 RunPythonor RunSQL操作来为每个现有行生成一个唯一值(示例中为 UUID)。还要添加uuid. 例如在0005_populate_uuid_values.py中
# Generated by Django A.B on YYYY-MM-DD HH:MM
from django.db import migrations
import uuid
def gen_uuid(apps, schema_editor):
MyModel = apps.get_model('myapp', 'MyModel')
for row in MyModel.objects.all():
row.uuid = uuid.uuid4()
row.save(update_fields=['uuid'])
class Migration(migrations.Migration):
dependencies = [
('myapp', '0004_add_uuid_field'),
]
operations = [
# omit reverse_code=... if you don't want the migration to be reversible.
migrations.RunPython(gen_uuid, reverse_code=migrations.RunPython.noop),
]
最后正常只执行migrate命令就可以对现在的数据表添加唯一字段了
标签:uuid,解决方案,migrations,添加,报错,Migration,表中,迁移,True From: https://www.cnblogs.com/zonghan/p/16729370.html