我試圖刪除一個具體的父模型,並將其一些字段直接複製到孩子。在使用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>
在這兩個makemigrations
和migrate
的運行點並出現此錯誤,父模型不再出現在代碼作爲類的父,然而移民仍然抱怨。
類似的問題has been asked here before和接受的解決方案涉及到創建一個新的模型,複製數據,替換現有的模型,並複製數據。不幸的是,這種方法在我的情況下不起作用。這是一個建立的模型,有許多外鍵指向它,如果原始記錄被刪除,這將丟失。
我南下使用(簡化)方法是:
- 取出模型作爲家長和添加新的領域給孩子
- 添加一個明確的主鍵字段具有相同的名稱作爲舊汽車
*_ptr_id
場 運行
schemamigration
和編輯文件:- 刪除南的企圖刪除和r ecreate的
*_ptr
場 - 添加一些自定義邏輯刪除
*_ptr_id
領域的ForeignKey的岬和添加的PrimaryKey岬
- 刪除南的企圖刪除和r ecreate的
- 使用
datamigration
搶出值的老上級,並將它們添加到新的領域對孩子
這是我一直希望將相當容易地適應本地的Django遷移的做法,我得到了(有一些調整)的*_ptr_id
現場更換邏輯去。但Django不會讓我添加新的字段。我曾嘗試以下:
- 卸下父模型並執行自定義
*_ptr_id
替換,遷移和添加的字段作爲第二遷移。 - 刪除父模型和而不是編輯文件手動混淆
*_ptr_id
,但離開Django的刪除/添加操作和遷移--fake
。
在這兩種情況下,以後的遷移將添加具有與舊父項相同的名稱的新字段會導致上述錯誤。 Django拒絕承認舊的父模型不再是該類的父類。
有沒有其他人有這個問題,並能夠解決它?
編輯:
這似乎是由CreateModel
模式操作類上市父模型的參數bases
引起的,缺乏一個匹配操作的更新列表。 documentation for CreateModel
將此參數列爲可選項,但在以前應用的遷移中是否存在任何手動更改此值的副作用?
是的,在沒有找到其他的選擇並且沒有得到任何答覆的情況下,我最終還是編輯了「bases」這一行。從那以後,我沒有注意到任何不良影響。而且,由於我忽視了回來並回答這個問題,先生,您剛剛贏得了一個被接受的答案;)。 – oogles