2017-07-06 51 views
1

我有模型和遷移文件的名爲「app1」的django應用程序。 我將此應用重命名爲「app2」,並且我修復了所有導入,網址... 但我在遷移文件和表中的數據時遇到問題。 我如何寫用正確的方式遷移,以確保: - 新安裝=>創建新表 - 更新舊版本=>創建新表,將數據移動,刪除舊錶Django重命名應用程序和遷移

PS:有幾個表與許多FK。

這裏是我的進步,我不知道如果我的好辦法: - 所有舊的遷移刪除 - makemigrations產生新的遷移文件

後這2步我可以安裝我的應用程序,但舊版本仍然存在問題。

問題:什麼是遷移數據的最佳方式? PS:我不使用南方。我不會使用南方。

回答

1

我發現這是一個解決方案工作

1-修復老移民與新FK和新的應用程序依賴

2-力老遷移創建與舊應用程序的名稱表,因此該旅店migrations.CreateModel .options,在每個遷移文件中添加'db_table:'app1_table_name'

add replaces = [('app1','migration_file_name')]。這將告訴Django的,目前的遷移(app2.migration_file_name)將取代舊的文件,這將prevenent Django的執行遷移兩次

4-創建遷移文件忒重命名錶,與migrations.AlterModelTable

+0

要添加對此,我發現當使用此方法重命名應用程序時,django不更新內容類型,而是在運行遷移時爲每個應用程序模型創建新的內容類型(和權限)。如果你使用通用的外鍵等,這會造成麻煩。我通過在所有的'AlterModelTable'之前添加'RunPython'操作來解決這個問題。我的'RunPython'函數運行'ContentType = apps.get_model('contenttypes','ContentType')''ContentType.objects.filter(app_label ='old_app')。update(app_label ='new_app')' – DBrowne

0

重命名應用程序始終是一個棘手的問題。

如果您像進行簡單的表重命名遷移那樣進行遷移,則任何時候舊應用程序的apps.get_model()都無法工作,因爲該應用程序根本不存在。我發現this answer。我知道你沒有使用南方,但我認爲可能以同樣的方式工作,只是跳過南方的步驟。

基本上,你必須:

  1. 轉儲數據,之前重命名,爲JSON文件

  2. 在回答運行該腳本從JSON文件重命名引用APP1APP2

  3. 重命名應用1APP2(所有進口引用,settings.py等)

  4. 運行遷移創建表的APP 2

  5. 負荷JSON文件中的數據到數據庫

  6. APP1

我希望這可以幫到你。