我终于成功地完成了这些迁移:
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 同步的序列。
Notes :
在数据迁移函数中使用 user.person_ptr 会使 django 由于未保存 person 实例而拒绝保存用户。所以我做了一个 get 查询来获取用户的 person 实例。
perserve_default=false 对于避免 django 需要新的迁移来删除自动字段的默认值很重要