我終於成功與論文遷移做:
1)改變Django的通過註釋列刪除person_ptr和列創建「身份證」的自動遷移。然後添加一個「ID」列整數:
migrations.AddField(
model_name='user',
name='id',
field=models.IntegerField(null=True)
),
2)創建用於從人將數據遷移到用戶,去除person_ptr字段和變化的「id」類型一個新的空遷移到自動字段
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的不肯救,因爲沒有得救的人實例的用戶。所以我做了一個查詢來獲取用戶的個人實例。避免的Django需要一個新的遷移爲對自動字段
刪除默認值
perserve_default =假是非常重要的爲什麼不把在多個步驟?用所有字段創建一個新模型'NewUser',然後從用戶模型遷移數據,然後刪除用戶模型並將NewUser重命名爲用戶 –