Django迁移应用程序名称的更改(活动项目)

时间:2017-02-06 01:53:39

标签: python django

所以......我已经做了很多研究......有答案,但没有完整或适当的答案。我有一个正在使用和正在生产的django“项目”,其中“主要”应用程序被称为“页面”......出于相当愚蠢的原因。我现在的问题是添加夹层...它有一个子模块mezzanine.pages(似乎是必需的....但我很确定我需要它。)

mezzanine.pages显然与“页面”冲突......

现在...我的页面包含一系列非平凡的模型,包括一个扩展用户(一对一参考)的模型,以及许多对其他应用程序表的引用(幸运的是只有出站,ForeignKey)。它还有管理/命令和大约20次迁移它自己的历史。

我认为我要么必须将页面更改为mypages,要么还有另一条路径(看似改变mezzanine.pages似乎是错误的)。

供参考,该项目目前在Django 1.8上,因此首选答案包括迁移。

1 个答案:

答案 0 :(得分:3)

自从我发布以来,我一直在研究这个问题,真正的答案是我从多个来源(包括其他堆栈交换帖子)合成的。

所以......在我开始使用之前,Django的一切都发生了变化。在1.7之后,“迁移”#39; bit被内化,帖子包括“" South"是关于 1.7之前世界是如何的。此外,我案例中的复杂问题涉及迁移问题,因为项目已经处于活动状态,并且生产中有真实的数据。

有一些帖子包括GITHub代码块,讨论了将表从一个App迁移到另一个App。这本身就是这个过程的一部分,但是有几个帖子指出要做这个过程"迁移"您需要将Migration.py放在另一个应用程序中。甚至可能是为此目的创建的应用程序。

最后,我决定通过更改相关应用程序中labelApplication中的apps.py来解决问题。在我的情况下,我正在改变"页面"到" phpages"但我的应用程序的目录名仍然是页面。这适用于我,因为夹层应用的页面" sub-App返回python库,而不是文件系统中的冲突。如果这不是你的情况,你可以再次使用label来解决它。

所以...一步一步,我的程序将pages重命名为phpages

  1. apps.py子目录中创建pages。在其中:

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

    其中的关键是label,它会改变一切。

  2. __init__.py子目录的pages中,添加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. 下找到这些内容
  6. 如果您在from pages.models import Something之前引用其他模块中的外键,然后使用ForeignKey(Something),那么您就可以使用此止损。如果您使用ForeignKey('pages.Something'),则需要将这些引用更改为ForeignKey('phpages.Something')。我认为其他类似参考也是一样的。

  7. 在接下来的4个步骤(7,8,9和10)中,我构建了pagestophpages.sql并将其添加到pages子目录中。它不是标准的django,但每个测试副本和数据库的每个生产副本都需要相同的步骤。

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

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

  10. 现在......在你的数据库中(我的是PostgreSQL)会有一堆以" pages"开头的表。您需要列出所有这些。在PostgreSQL中,除了表之外,每个AutoField都会有序列。对于每个表格构建ALTER TABLE pages_something RENAME TO phpages_something;,对于每个序列ALTER SEQUENCE pages_something_id_seq RENAME TO phpages_something_id_seq;

  11. 您应该备份数据库。您可能需要尝试几次。通过数据库shell运行SQL脚本。请注意,所有其他更改都可以通过源代码控制(git,svn等)传播。必须在每个数据库上运行最后一步。

  12. 显然,您需要将pagesphpages更改为您的内容。您可能拥有多个包含一个自动字段的表,但可能未将其命名为something

    另一方面,就流程而言,这可能是您的开发中需要同步的一个难点。鉴于我们正在进行编辑迁移和更改名称,您需要在开发过程中进行严格的停止,以便更改所有内容(开发框,测试框,登台框,生产框......和他们所有的数据库都处于相同的版本和架构中。 YMMV。

    这也是使用label的{​​{1}}字段解决问题的方法。我选择此方法是为了更改目录名称,因为它涉及更少的更改。我选择不更改class Application字段,因为这对我不起作用。 YMMV。

    我必须说myapp / pages与mezzanine.pages冲突有点失望。看起来有些原因是由于数据库表名中使用了name slug(而且在我的脑海中,我没有看到一个很好的解决方案)。我认为没有意义的是等同于来自夹层导入页面的"作为mpages"或者某些。能够为导入的应用程序添加别名(不在我自己的文件树中讨论应用程序)。我认为如果我将应用程序插入到我自己的文件树中,这可能是可能的---但这似乎也不是一个受制裁的行为。