2011-09-19 79 views
8

我最近開始在我的Django項目中使用South進行遷移。直到最近,當我遇到一個奇怪的問題時,一切進展順利。South在不同的應用程序中遵循什麼遷移順序?

我在我的項目中有兩個應用程序,比如App-A和App-B。 App-A中的模型具有App-B中模型的外鍵。當我嘗試構建我的系統時,我運行了syndb,它創建了所有auth_south_表。然後我跑了migrate這引發了錯誤。當它試圖從引用App-B模型的App-A創建模型時,模型App-B尚未遷移/創建,因此也是錯誤。

爲了解決這個問題,我必須先手動遷移App-B,然後再App-A。我在這裏做錯了什麼? South應該如何知道跨應用程序的遷移順序?

謝謝。

回答

16

這解釋了它https://south.readthedocs.io/en/latest/dependencies.html

遷移的應用是很好的「東經所有,但是當你開始寫 大的項目,有很多的應用程序,你會意識到你有應用程序,並制定出什麼樣的順序遷移會 需求之間的外鍵 關係爲每個應用程序應用是痛苦的。

幸運的是,我們也有這個問題,所以南有一個依賴系統。 在遷移中,您可以聲明它依賴於另一個 應用程序首先運行某個遷移;例如,如果我的應用程序 「論壇」依賴於「賬戶」已經創建的應用程序的用戶配置文件 表中,我們可以這樣做:

# forum/migrations/0002_post.py class Migration: 

    depends_on = (
     ("accounts", "0003_add_user_profile"), 
    ) 

    def forwards(self): 

然後,如果你試圖遷移到或超過0002_post在論壇應用程序,它首先會確保帳戶至少遷移到 直到0003_add_user_profile,如果不是,將會爲您遷移它。

依存關係也可以反向工作; South知道不會撤消該0003_add_user_profile遷移,直到它已撤消遷移0002_post 。

你可以有多個依賴和各種古怪的結構; 有,但是,兩個規則:

沒有循環依賴(取決於每個 其他兩個或兩個以上的遷移)在相同的應用程序不依賴向上(所以你不能讓 0002_post在論壇上的應用程序依賴於0003_room在相同的應用程序,直接或通過依賴鏈或者 。

12

South按照它們出現在settings.py中的INSTALLED_APPS元組中的順序遷移應用。所以只要確保App-B在你的settings.py中出現在App-A之前,它應該可以工作:)

+0

剛上投這一點,因爲這其實是非常重要的。'depends_on'和'needed_by'似乎只控制實際的遷移。如果你剛開始遷移時,就像我的情況一樣,South將在遷移完成後嘗試加載應用程序的初始數據。我遇到了應用程序的初始da在另一個人需要它並遇到外鍵問題之前,它們並不可用。我可以通過重新訂購INSTALLED_APPS中的應用程序來解決此問題。South運行應用程序的順序是它們在'INSTALLED_APPS'中暫停運行任何遷移依賴關係。 – jaywhy13