2014-01-07 94 views
0

我正在開發一個Django應用程序,並且遇到了一個關於並行進行的2個南部遷移的奇怪問題。爲什麼模式遷移 - 自動創建虛假遷移?

一次遷移對應於創建一個新模型(我們稱其爲'0001_add_model'),第二個遷移對應於將字段添加到現有模型(我們稱之爲'0001_add_new_field_to_model')。現在,這兩個遷移是在兩個不同的分支平行進行的(我不會再犯這個錯誤)。當我運行./manage.py migrate時,南告訴我存在問題,並且我可以用--merge運行該命令來運行遷移。鑑於這兩項行動涉及不同的模式,我認爲這樣做不應該有問題,所以我做到了,一切順利。

從這一點起,我做了一個./manage.py schemamigration --auto這個問題就出現了,它產生了一個與'add_model'實際上相同的遷移,除了'add_field_to_model'中添加的字段。它看起來像這樣:

(*) 0001_auto__add_model 

(*) 0001_auto__add_new_field_to_model 

-> () 0002_auto__add_model 

如果我做的其他方式則產生相反的,即遷移補充說,在「add_field_to_model」添加字段。在這兩種情況下,生成的新遷移顯然都不適用,因爲這些更改已經存在於數據庫中。

讓我困惑的是爲什麼它會產生這樣的遷移。南方的自動檢測器如何工作以創建新的遷移?

我爲了繼續開發而做的就是用--fake運行這種虛假遷移,但我認爲最終的解決方案將是重置遷移歷史,因爲這一點很麻煩,因爲它在幾個環境中被複制。

回答

1

問題來自於「凍結」模型狀態在前兩次遷移中不一致。如果您查看遷移文件,您會看到Migration類具有models屬性,這是在生成遷移時模型的「凍結」表示。 South然後使用這個表示 - 最後一個應用的遷移文件中的表示 - 來檢測更改並生成新的遷移。由於您的兩個「0001_XXX」遷移具有不同的「凍結」模型,因此將針對模型的錯誤表示生成任何新的遷移。

顯然,解決方案是手動修復「0001_XXX」遷移的models

而且,是的,南+平行分支可能是一種痛苦,但我無法看到南方怎樣才能更好地完成ATM工作。

+0

它的工作!不幸的是,每當兩個或更多的遷移並行產生,我想這個問題就會出現。當南方抱怨時,猜測這將是一個特別關注的問題。謝謝! – MartinDM