2017-06-07 78 views
2

我有一個從非抽象的超級模特繼承模式:由於觀念的錯誤刪除模式的繼承和保持ID在新創建的自動字段

class Person(models.Model): 
    pass 

class User(Person): 
    pass 

我們要刪除的人物模型和複製所有的人數據給用戶。主要問題涉及「id」AutoField。

用戶模型沒有任何由django自動創建的id字段。由於繼承,用戶的主鍵是「person_ptr_id」。

我正在嘗試進行數據庫遷移。 Django遷移想要將「id」字段添加爲AutoField,但要求默認值。我想從每個用戶記錄的person_ptr_id複製初始值。 我也希望postgres序列與值同步。

您是否已經執行了此類遷移?

+0

刪除默認值

perserve_default =假是非常重要的爲什麼不把在多個步驟?用所有字段創建一個新模型'NewUser',然後從用戶模型遷移數據,然後刪除用戶模型並將NewUser重命名爲用戶 –

回答

0

我終於成功與論文遷移做:

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需要一個新的遷移爲對自動字段