如何在迁移过程中复制字段值?

How to duplicate field value during migration?

我有一个只存储单个值的模型:

 class Number(models.Model):
     id = models.AutoField(primary_key=True, unique=True)

现在我想改变行为,这样我需要的数字就不再是唯一的了。

class Number(models.Model):
    id = models.AutoField(primary_key=True, unique=True)
    number = models.IntegerField(blank=True)

如何告诉迁移使用 ID 字段作为 "one-off value"?

您需要在两次迁移中执行此操作。第一个将添加字段,一次性默认值为 0。第二个将复制值:这可以使用 RunPython 函数来完成,该函数执行如下操作:

from django.db.models import F
Number.objects.update(number=F('id'))

我做这种事情的方法是像你已经完成的那样添加字段 运行 那个迁移

python manage.py schemamigration your_app --auto
python manage.py migrate your_app

然后你可以像这样创建一个数据迁移

python manage.py datamigration your_app copy_id_to_number

然后打开刚才用上面的命令创建的迁移文件,把def forward(self, orm)改成这样

def forwards(self, orm):
    for num in orm.Number.objects.all():
        if num.id:
            num.number = num.id

然后你会想要运行这个迁移

python manage.py migrate your_app