当我想将列的类型从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。
答案 0 :(得分:0)
最后我的问题解决了。方式很简单。我将迁移分为两个步骤,一个是添加新字段,另一个是迁移数据。原因是' 0002_auto_20150205_0501'没有包括新领域。所以' result.save'没有更新不存在的列' uuid'甚至result.uuid设置了一个值