簡體   English   中英

Django遷移應用程序名稱的更改(活動項目)

[英]Django Migrate Change of App Name (active project)

所以...我已經做了很多研究......有答案,但沒有完整或適當的答案。 我有一個正在使用和正在生產的django“項目”,其中“主要”應用程序被稱為“頁面”......出於相當愚蠢的原因。 我現在的問題是添加夾層...它有一個子模塊mezzanine.pages(似乎是必需的....但我很確定我需要它)。

mezzanine.pages顯然與“頁面”沖突......

現在...我的頁面包含一系列非平凡的模型,包括一個擴展用戶(一對一參考),以及許多對其他應用程序表的引用(幸運的是只有出站,ForeignKey)。 它還有管理/命令和大約20次遷移它自己的歷史。

我知道我要么必須將頁面更改為mypages,要么還有另一條路徑(看似改變mezzanine.pages似乎是錯誤的)。

供參考,該項目目前在Django 1.8上,因此首選答案包括遷移。

自從我發布它以來,我一直在研究這個問題, 真正的答案是我從多個來源(包括其他堆棧交換帖子)合成的內容。

所以......在我開始使用之前,Django的一切都發生了變化。 在1.7之后,“遷移”位被內化,包括“南方”在內的帖子是關於1.7 之前的世界。 此外,我案例中的復雜問題涉及遷移問題,因為項目已經處於活動狀態,並且生產中有真實的數據。

有一些帖子包括GITHub代碼塊,討論了將表從一個應用程序遷移到另一個應用程序。 這本質上是該過程的一部分,但有幾篇文章指出要將此作為“遷移”,您需要將Migration.py放在另一個應用程序中。 也許甚至是為此目的創建的應用程序。

最后,我決定通過更改相關Applicationapps.pyApplication類中的label來解決問題。 在我的情況下,我將“頁面”更改為“phpages”,但我的應用程序的目錄名仍然是頁面。 這對我有用,因為夾層應用程序的“頁面”子應用程序回到python庫中而不是文件系統中的沖突。 如果這不是您的情況,您可以使用另一種label來解決它。

所以...一步一步,我的程序將pages重命名為phpages

  1. pages子目錄中創建apps.py 在它放:

    class PagesConfig(AppConfig): name = "pages" label = "phpages" verbose_name = "Purple Hat Pages"

    其中的關鍵是label ,它將改變一切。

  2. pages子目錄的__init__.py中,輸入default_app_config = "pages.apps.PagesConfig"

  3. 在您的settings.py ,將應用的INSTALLED_APPS條目更改為'pages.apps.PagesConfig', ...

  4. 您需要在此步驟中編輯所有遷移。 dependencies列表中,您需要將'pages'更改為'phpages' ForeignKey是你能還需要改變'pages.Something''phpages.Something'在每一個遷移文件中的每個東西。 pages/mitrations/nnnn_*.py下找到這些

  5. 如果你通過from pages.models import Something然后使用ForeignKey(Something) from pages.models import Something其他模塊中的外鍵,那么你很適合這個停止。 如果你使用ForeignKey('pages.Something')那么你需要更改對ForeignKey('phpages.Something')引用。 我認為其他類似參考也是一樣的。

  6. 在接下來的4個步驟(7,8,9和10)中,我構建了pagestophpages.sql並將其添加到pages子目錄中。 它不是標准的django,但每個測試副本和數據庫的每個生產副本都需要相同的一組步驟。

  7. UPDATE django_contecnt_type SET app_label='phpages' WHERE app_label='pages';

  8. UPDATE django_migrations SET app='phpages' WHERE app='pages';

  9. 現在......在你的數據庫中(我的是PostgreSQL),會有一堆以“pages”開頭的表。 您需要列出所有這些。 在PostgreSQL中,除了表之外,每個AutoField都有序列。 對於每個表構造ALTER TABLE pages_something RENAME TO phpages_something; 對於每個序列ALTER SEQUENCE pages_something_id_seq RENAME TO phpages_something_id_seq;

  10. 您應該備份數據庫。 您可能需要嘗試幾次。 通過數據庫shell運行SQL腳本。 請注意,所有其他更改都可以通過源代碼控制(git,svn等)傳播。 必須在每個數據庫上運行最后一步。

顯然,你需要將pagesphpages更改為你的東西。 你可能有一個汽車領域的多個表,它可能不會被命名為something

另一方面,就流程而言,這可能是您的開發中需要同步的一個難點。 鑒於我們正在進行編輯遷移和更改名稱,您需要在開發過程中進行硬停止,以便將要更改的所有內容(開發框,測試框,登台框,生產框......以及所有數據庫)都是在相同的修訂和架構。 因人而異。

這也是通過使用class Applicationlabel字段來解決問題。 我選擇此方法是為了更改目錄名稱,因為它涉及更少的更改。 我選擇不更改name字段,因為這對我不起作用。 因人而異。

我必須說myapp / pages與mezzanine.pages沖突我有點失望。 看起來有些原因是由於在數據庫表名中使用了pages slug(而且在我的腦海中,我沒有看到一個好的解決方案)。 我認為沒有意義的是相當於“從mezzanine import pages as mpages”或者其他一些東西。 能夠為導入的應用程序添加別名(不在我自己的文件樹中討論應用程序)。 我認為如果我將應用程序插入到我自己的文件樹中,這可能是可能的---但這似乎也不是一個受制裁的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM