所以。。。我对此做了很多研究。。。有答案,但没有完整或适当的答案。我有一个正在使用和生产中的django"项目",其中的"主"应用程序被称为"页面"。。。出于相当愚蠢的原因。我现在的问题是添加夹层。。。它有一个子模块mezzanie.pages(似乎是必需的……但我很确定我需要它)。
mezzanie.pages显然与"pages"冲突。。。
现在。。。我的页面包含大量非琐碎的模型,包括一个扩展用户的模型(一对一引用),以及许多对其他应用程序表的引用(幸运的是,只有出站,ForeignKey)。它还拥有管理/命令和大约20个自己历史的迁移。
我想我要么必须将页面更改为我的页面,要么有其他途径(似乎更改了mezzanie.pages似乎是错误的)。
作为参考,该项目目前在Django 1.8上,因此首选答案包括迁移。
自从我发布它以来,我一直在研究这个问题,而真正的答案是我从多个来源(包括其他堆栈交换帖子)合成的。
所以。。。在我开始使用Django之前,它的一切都发生了变化。在1.7之后,"迁移"部分被内化了,包括"南方"一词在内的帖子都是关于1.7之前的世界。此外,我的案例中的复杂性涉及迁移问题,因为该项目已经处于活动状态,并且在生产中有真实的数据。
有一些帖子包括一段GITHub代码,谈到了将表从一个应用程序迁移到另一个应用。这本质上是这个过程的一部分,但有几篇文章指出,要将其作为"迁移",您需要将migration.py放在另一个应用程序中。甚至可能是为此目的创建的应用程序。
最后,我决定通过在所讨论的应用程序中更改apps.py
的Application
类中的label
来解决这个问题。在我的例子中,我将"pages"更改为"phpages",但我的应用程序的目录名仍然是pages。这对我来说很有效,因为夹层应用程序的"页面"子应用程序又回到了python库中,而不是文件系统中的冲突。如果这不是您的情况,您可以使用label
来解决它。
所以。。。一步一步,我的程序将pages
重命名为phpages
。
-
在
pages
子目录中创建apps.py
。输入:class PagesConfig(AppConfig): name = "pages" label = "phpages" verbose_name = "Purple Hat Pages"
其中的关键是
label
,它将改变一切。 -
在
pages
子目录的__init__.py
中,放入default_app_config = "pages.apps.PagesConfig"
-
在您的
settings.py
中,将应用程序的INSTALLED_APPS
条目更改为'pages.apps.PagesConfig',
。。。 -
在此步骤中,需要编辑所有迁移。在
dependencies
列表中,您需要将'pages'
更改为'phpages'
。在ForeignKey
中,您还需要将每个迁移文件中的每个东西的'pages.Something'
更改为'phpages.Something'
。在pages/mitrations/nnnn_*.py
下查找这些 -
如果您通过
from pages.models import Something
引用其他模块中的外键,然后使用ForeignKey(Something)
,那么您就可以完成此站点。如果使用ForeignKey('pages.Something')
,则需要将这些引用更改为ForeignKey('phpages.Something')
。我想其他类似的参考文献也是一样的。 -
对于接下来的4个步骤(7、8、9和10),我构建了
pagestophpages.sql
并将其添加到pages
子目录中。这不是一个标准的django,但数据库的每个测试副本和每个生产副本都需要相同的步骤集。 -
UPDATE django_contecnt_type SET app_label='phpages' WHERE app_label='pages';
-
UPDATE django_migrations SET app='phpages' WHERE app='pages';
-
现在。。。在您的数据库(我的数据库是PostgreSQL)中,会有一堆以"pages"开头的表。你需要列出所有这些。在PostgreSQL中,除了表之外,每个
AutoField
都会有序列。对于每个表构造ALTER TABLE pages_something RENAME TO phpages_something;
对于每个序列ALTER SEQUENCE pages_something_id_seq RENAME TO phpages_something_id_seq;
-
您可能应该备份数据库。您可能需要尝试几次。通过数据库外壳运行SQL脚本。请注意,所有其他更改都可以通过源代码控制(git、svn等)进行传播。最后一步必须在每个数据库上运行。
显然,您需要将pages
和phpages
更改为您的内容。您可能有多个带有一个自动字段的表,并且该表的名称可能不为something
。
就流程而言,另一件值得注意的事情是,这可能是您开发中的一个难点,在这里一切都需要同步。考虑到我们正在处理编辑迁移和更改名称的问题,您需要在开发中进行一次硬停,以便将要更改的所有内容(开发框、测试框、暂存框、生产框…以及它们的所有数据库)都处于同一版本和模式。YMMV。
这也是通过使用CCD_ 39的CCD_。我选择这种方法是为了避免更改目录名,因为它涉及的更改较少。我选择不更改name
字段,因为这对我不起作用。YMMV。
我必须说,我对myapp/pages与mezzanie.pages冲突感到有点失望。看起来有些原因是由于数据库表名中使用了pages
段塞(我想不出有什么好的解决方案)。我认为这是没有意义的,相当于"从夹层导入页面作为mpages"或诸如此类的东西。别名导入的应用程序的能力(而不是在我自己的文件树中谈论应用程序)。我认为如果我把应用程序吸入我自己的文件树中,这可能是可能的——但这似乎也不是一种受制裁的行为。