我终于通过这些迁移成功了:
1) 通过注释删除 person_ptr 和创建 'id' 列来更改 django 的自动迁移。然后添加一个“id”列作为整数:
migrations.AddField(
model_name='user',
name='id',
field=models.IntegerField(null=True)
),
2) 创建一个新的空迁移,用于将数据从个人迁移到用户,删除 person_ptr 字段并将“id”类型更改为 AutoField
def copy_persons_data(apps, schema_editor):
User = apps.get_model("accounts", "User")
Person = apps.get_model("persons", "Person")
for user in User.objects.all():
person = Person.objects.get(id=user.person_ptr_id)
user.new_field1 = person.new_field1
user.new_field2 = person.new_field2
user.id = person.id
user.save()
class Migration(migrations.Migration):
dependencies = [
('accounts', '0026_auto_20170606_1524'),
]
operations = [
migrations.RunPython(copy_persons_data, reverse_code=migrations.RunPython.noop),
migrations.RemoveField(
model_name='user',
name='person_ptr',
),
migrations.AlterField(
model_name='user',
name='id',
field=models.AutoField(auto_created=True, null=False, primary_key=True, serialize=False, verbose_name='ID'),
preserve_default=False,
),
]
这样做,django 会自动为 'id' 字段创建序列,并与最大 id 同步。
注意事项:
在 datamigration 函数中使用 user.person_ptr 会导致 django 拒绝保存用户,因为未保存的 person 实例。所以我做了一个 get 查询来获取用户的 person 实例。
perserve_default=false 对于避免 django 需要新的迁移来删除自动字段的默认值很重要