gpt4 book ai didi

python - Django迁移应用名称更改(事件项目)

转载 作者:太空宇宙 更新时间:2023-11-04 10:03:45 25 4
gpt4 key购买 nike

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

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

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

我搜集到我必须将页面更改为mypages还是存在另一条路线(似乎更改mezzanine.pages似乎是错误的)。

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

最佳答案

自发布以来,我一直在研究此问题,而真正的答案是我从多个来源(包括其他堆栈交换帖子)中综合得出的结果。

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

有一些帖子,包括GITHub代码段,它们讨论了将表从一个应用程序迁移到另一个应用程序的过程。这本质上是该过程的一部分,但是有几篇文章指出,要作为“迁移”进行此操作,您需要将Migration.py放在另一个应用程序中。甚至是为此目的而创建的应用程序。

最后,我决定通过更改相关应用程序中labelApplication类中的apps.py来解决该问题。就我而言,我正在将“页面”更改为“ phpages”,但是我的应用程序的目录名称仍然是页面。这对我有用,因为夹层应用程序的“页面”子应用程序又回到了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;
您可能应该备份数据库。您可能需要尝试几次。通过数据库外壳运行SQL脚本。请注意,所有其他更改都可以通过源代码控制(git,svn等)传播。最后一步必须在每个数据库上运行。


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

在过程方面,需要注意的另一件事是,这可能是开发中需要同步所有事情的难点。鉴于我们正在编辑迁移和更改名称,因此您需要在开发中进行硬停,以便将要更改的所有内容(开发箱,测试箱,登台箱,生产箱...及其所有数据库)都已更改。在相同的修订版和架构中。 YMMV。

通过使用labelclass Application字段也可以解决此问题。我选择此方法是为了更改目录名,因为它涉及的更改较少。我选择不更改name字段,因为这对我不起作用。 YMMV。

我必须说myapp / pages与mezzanine.pages冲突令我有些失望。看起来有些原因是由于在数据库表名称中使用了pages子句(而且我的头上没有,我在那里看不到一个好的解决方案)。我认为这没有什么意义,等效于“从夹层导入页面作为mpages”之类的东西。为导入的应用程序加上别名的能力(不是在我自己的文件树中谈论应用程序)。我认为,如果我将应用程序吸收到自己的文件树中,则可能会实现---但这似乎也不是批准的行为。

关于python - Django迁移应用名称更改(事件项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42059381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com