2015-10-19 32 views
2

我試圖刪除一個具體的父模型,並將其一些字段直接複製到孩子。在使用South之前,我已經多次執行過類似的過程(在其他孩子身上使用同一父模型),但是自從升級到Django 1.7後,它只是不玩遊戲。 Django的過程中migrate過程中提供了以下錯誤:Django migrations拒絕承認一個模型不再繼承自老父母

FieldError: Local field <field_name> in class <child_model> clashes with field of similar name from base class <parent_model> 

在這兩個makemigrationsmigrate的運行點並出現此錯誤,父模型不再出現在代碼作爲類的父,然而移民仍然抱怨。

類似的問題has been asked here before和接受的解決方案涉及到創建一個新的模型,複製數據,替換現有的模型,並複製數據。不幸的是,這種方法在我的情況下不起作用。這是一個建立的模型,有許多外鍵指向它,如果原始記錄被刪除,這將丟失。

我南下使用(簡化)方法是:

  1. 取出模型作爲家長和添加新的領域給孩子
  2. 添加一個明確的主鍵字段具有相同的名稱作爲舊汽車*_ptr_id
  3. 運行schemamigration和編輯文件:

    • 刪除南的企圖刪除和r ecreate的*_ptr
    • 添加一些自定義邏輯刪除*_ptr_id領域的ForeignKey的岬和添加的PrimaryKey岬
  4. 使用datamigration搶出值的老上級,並將它們添加到新的領域對孩子

這是我一直希望將相當容易地適應本地的Django遷移的做法,我得到了(有一些調整)的*_ptr_id現場更換邏輯去。但Django不會讓我添加新的字段。我曾嘗試以下:

  • 卸下父模型並執行自定義*_ptr_id替換,遷移和添加的字段作爲第二遷移。
  • 刪除父模型和而不是編輯文件手動混淆*_ptr_id,但離開Django的刪除/添加操作和遷移--fake

在這兩種情況下,以後的遷移將添加具有與舊父項相同的名稱的新字段會導致上述錯誤。 Django拒絕承認舊的父模型不再是該類的父類。

有沒有其他人有這個問題,並能夠解決它?

編輯:

這似乎是由CreateModel模式操作類上市父模型的參數bases引起的,缺乏一個匹配操作的更新列表。 documentation for CreateModel將此參數列爲可選項,但在以前應用的遷移中是否存在任何手動更改此值的副作用?

回答

0

在Django 1.11中遇到同樣的問題後,我按照編輯後的建議在我的遷移文件中找到了最初的'CreateModel'調用。註釋掉bases=('{appname}.{modelname}',),行並明確將我的模型的主鍵設置爲'id',然後重新運行makemigrationsmigrate解決了我的問題。

我不確定主鍵更改是否與解決方案相關,我只是佈置變量。

另一種減少對模型名稱(和數據)的投入的方法是:在刪除父項時對其進行重命名。請注意,雖然這對我有效,但在另一個遷移中切換回原始模型名稱時,會出現同樣的「一旦孩子,一直是孩子」錯誤,因此您仍然需要在遷移中編輯'bases ='行。

感謝oogles和社區!

+0

是的,在沒有找到其他的選擇並且沒有得到任何答覆的情況下,我最終還是編輯了「bases」這一行。從那以後,我沒有注意到任何不良影響。而且,由於我忽視了回來並回答這個問題,先生,您剛剛贏得了一個被接受的答案;)。 – oogles