如何在迁移期间复制字段值?

时间:2017-05-03 18:08:51

标签: django django-models django-migrations

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

 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字段作为“一次性值”?

2 个答案:

答案 0 :(得分:2)

我这样做的方法是添加你已经完成的字段并运行该迁移

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

答案 1 :(得分:1)

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

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