所以......我已经做了很多研究......有答案,但没有完整或适当的答案。我有一个正在使用和正在生产的django“项目”,其中“主要”应用程序被称为“页面”......出于相当愚蠢的原因。我现在的问题是添加夹层...它有一个子模块mezzanine.pages(似乎是必需的....但我很确定我需要它。)
mezzanine.pages显然与“页面”冲突......
现在...我的页面包含一系列非平凡的模型,包括一个扩展用户(一对一参考)的模型,以及许多对其他应用程序表的引用(幸运的是只有出站,ForeignKey)。它还有管理/命令和大约20次迁移它自己的历史。
我认为我要么必须将页面更改为mypages,要么还有另一条路径(看似改变mezzanine.pages似乎是错误的)。
供参考,该项目目前在Django 1.8上,因此首选答案包括迁移。
答案 0 :(得分:3)
自从我发布以来,我一直在研究这个问题,真正的答案是我从多个来源(包括其他堆栈交换帖子)合成的。
所以......在我开始使用之前,Django的一切都发生了变化。在1.7之后,“迁移”#39; bit被内化,帖子包括“" South"是关于 1.7之前世界是如何的。此外,我案例中的复杂问题涉及迁移问题,因为项目已经处于活动状态,并且生产中有真实的数据。
有一些帖子包括GITHub代码块,讨论了将表从一个App迁移到另一个App。这本身就是这个过程的一部分,但是有几个帖子指出要做这个过程"迁移"您需要将Migration.py放在另一个应用程序中。甚至可能是为此目的创建的应用程序。
最后,我决定通过更改相关应用程序中label
类Application
中的apps.py
来解决问题。在我的情况下,我正在改变"页面"到" phpages"但我的应用程序的目录名仍然是页面。这适用于我,因为夹层应用的页面" sub-App返回python库,而不是文件系统中的冲突。如果这不是你的情况,你可以再次使用label
来解决它。
所以...一步一步,我的程序将pages
重命名为phpages
。
在apps.py
子目录中创建pages
。在其中:
class PagesConfig(AppConfig):
name = "pages"
label = "phpages"
verbose_name = "Purple Hat Pages"
其中的关键是label
,它会改变一切。
在__init__.py
子目录的pages
中,添加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;
您应该备份数据库。您可能需要尝试几次。通过数据库shell运行SQL脚本。请注意,所有其他更改都可以通过源代码控制(git,svn等)传播。必须在每个数据库上运行最后一步。
显然,您需要将pages
和phpages
更改为您的内容。您可能拥有多个包含一个自动字段的表,但可能未将其命名为something
。
另一方面,就流程而言,这可能是您的开发中需要同步的一个难点。鉴于我们正在进行编辑迁移和更改名称,您需要在开发过程中进行严格的停止,以便更改所有内容(开发框,测试框,登台框,生产框......和他们所有的数据库都处于相同的版本和架构中。 YMMV。
这也是使用label
的{{1}}字段解决问题的方法。我选择此方法是为了更改目录名称,因为它涉及更少的更改。我选择不更改class Application
字段,因为这对我不起作用。 YMMV。
我必须说myapp / pages与mezzanine.pages冲突有点失望。看起来有些原因是由于数据库表名中使用了name
slug(而且在我的脑海中,我没有看到一个很好的解决方案)。我认为没有意义的是等同于来自夹层导入页面的"作为mpages"或者某些。能够为导入的应用程序添加别名(不在我自己的文件树中讨论应用程序)。我认为如果我将应用程序插入到我自己的文件树中,这可能是可能的---但这似乎也不是一个受制裁的行为。