【问题标题】:How to duplicate field value during migration?如何在迁移期间复制字段值?
【发布时间】:2017-05-03 18:08:50
【问题描述】:

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

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

【问题讨论】:

  • 当您尝试 makemigrations 并询问您如何处理已存在的记录时?
  • 是的。如何告诉它从另一个字段中获取值?
  • 您是否要将当前位于id 字段中的原件传输到number 字段?
  • 是的,我想把它复制到那里!不重命名字段。

标签: django django-models django-migrations


【解决方案1】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多