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



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

mezzanie.pages显然与"pages"冲突。。。

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

我想我要么必须将页面更改为我的页面,要么有其他途径(似乎更改了mezzanie.pages似乎是错误的)。

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

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

所以。。。在我开始使用Django之前,它的一切都发生了变化。在1.7之后,"迁移"部分被内化了,包括"南方"一词在内的帖子都是关于1.7之前的世界。此外,我的案例中的复杂性涉及迁移问题,因为该项目已经处于活动状态,并且在生产中有真实的数据。

有一些帖子包括一段GITHub代码,谈到了将表从一个应用程序迁移到另一个应用。这本质上是这个过程的一部分,但有几篇文章指出,要将其作为"迁移",您需要将migration.py放在另一个应用程序中。甚至可能是为此目的创建的应用程序。

最后,我决定通过在所讨论的应用程序中更改apps.pyApplication类中的label来解决这个问题。在我的例子中,我将"pages"更改为"phpages",但我的应用程序的目录名仍然是pages。这对我来说很有效,因为夹层应用程序的"页面"子应用程序又回到了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),那么您就可以完成此站点。如果使用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. 您可能应该备份数据库。您可能需要尝试几次。通过数据库外壳运行SQL脚本。请注意,所有其他更改都可以通过源代码控制(git、svn等)进行传播。最后一步必须在每个数据库上运行。

显然,您需要将pagesphpages更改为您的内容。您可能有多个带有一个自动字段的表,并且该表的名称可能不为something

就流程而言,另一件值得注意的事情是,这可能是您开发中的一个难点,在这里一切都需要同步。考虑到我们正在处理编辑迁移和更改名称的问题,您需要在开发中进行一次硬停,以便将要更改的所有内容(开发框、测试框、暂存框、生产框…以及它们的所有数据库)都处于同一版本和模式。YMMV。

这也是通过使用CCD_ 39的CCD_。我选择这种方法是为了避免更改目录名,因为它涉及的更改较少。我选择不更改name字段,因为这对我不起作用。YMMV。

我必须说,我对myapp/pages与mezzanie.pages冲突感到有点失望。看起来有些原因是由于数据库表名中使用了pages段塞(我想不出有什么好的解决方案)。我认为这是没有意义的,相当于"从夹层导入页面作为mpages"或诸如此类的东西。别名导入的应用程序的能力(而不是在我自己的文件树中谈论应用程序)。我认为如果我把应用程序吸入我自己的文件树中,这可能是可能的——但这似乎也不是一种受制裁的行为。

最新更新