使用Django数据迁移将旧列的值分配给新列

时间:2015-03-17 02:40:28

标签: django django-models

当我想将列的类型从int更改为char时,我遇到了问题。但我不能通过Django迁移直接做到这一点。所以我首先添加了一个新列,并希望使用旧列设置其值,SQL就像'update my_app_myqpp set uuid = id'。我怎么能通过Django迁移来做到这一点?谢谢!

def migrate_data(apps, schema_editor):
    MyApp = apps.get_model('my_app', 'MyApp')
    db_alias = schema_editor.connection.alias
    results = MyApp.objects.using(db_alias)
    for result in results:
        result.uuid = str(result.id)
        result.save()


class Migration(migrations.Migration):

    dependencies = [
        ('myq_app', '0002_auto_20150205_0501'),
    ]

    operations = [
        migrations.AddField(
            model_name='myapp',
            name='uuid',
            field=api.fields.UuidField(auto_created=True, default='0', editable=False, max_length=32, unique=True, verbose_name='UUID'),
            preserve_default=True,
        ),

        migrations.RunPython(migrate_data)
    ]

我也试过

MyApp.objects.raw('UPDATE docker_build_dockerbuild SET uuid=id')

但似乎没有执行migrate_data。

1 个答案:

答案 0 :(得分:0)

最后我的问题解决了。方式很简单。我将迁移分为两个步骤,一个是添加新字段,另一个是迁移数据。原因是' 0002_auto_20150205_0501'没有包括新领域。所以' result.save'没有更新不存在的列' uuid'甚至result.uuid设置了一个值