如何在迁移过程中复制字段值?
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
我有一个只存储单个值的模型:
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