如何更改Django应用的名称?


156

我通过重命名应用程序的文件夹,导入及其所有引用(模板/索引)来更改了Django中应用程序的名称。但是现在当我尝试运行时出现此错误python manage.py runserver

Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

如何调试和解决此错误?有什么线索吗?


嗨,danihp。是的,我有。我也在使用virtualenv,我不知道这是否与之有关。
安德烈·

1
如果您有机会使用PyCharm,它的rename功能将极大地帮助您。
2014年

1
南方不是支持这种行动吗?
andilabs

Answers:


285

请按照以下步骤在Django中更改应用的名称:

  1. 重命名项目根目录中的文件夹
  2. 更改为您的应用程序的任何引用他们的依赖关系,即应用程序的views.pyurls.py“manage.py”,和settings.py文件。
  3. django_content_type使用以下命令编辑数据库表:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. 另外,如果您有模型,则必须重命名模型表。供postgres使用ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName。对于MySQL我也认为它是相同的(如@null_radix所提到的)
  5. (对于Django> = 1.7),更新django_migrations表以避免重新运行以前的迁移:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'注意:对于Django 1.8+是否需要执行此步骤,存在一些争论(在注释中)。如果有人知道,请在这里更新。
  6. 如果您models.py的的元类已app_name列出,请确保也将其重命名(由@will提及)。
  7. 如果您已在应用程序中为statictemplates文件夹命名空间,则还需要重命名它们。例如,重命名old_app/static/old_appnew_app/static/new_app
  8. 要重命名django models,您需要更改django_content_type.nameDB中的条目。对于PostgreSQL使用UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

元点(如果使用virtualenv):值得注意的是,如果要重命名包含virtualenv的目录,则env中可能有几个文件包含绝对路径,并且也需要更新。如果您遇到诸如此类的错误,ImportError: No module named ...可能是罪魁祸首。(感谢@danyamachine提供此功能)。

其他参考:您可能还想参考以下链接以获得更完整的图片

  1. 使用Django和South重命名应用程序
  2. 如何将模型从一个django应用程序迁移到新的模型中?
  3. 如何更改Django应用的名称?
  4. 使用Django South向后迁移
  5. 使用Django / South重命名模型的最简单方法?
  6. Python代码(感谢A.Raouf)可以自动完成上述步骤(未经测试的代码。已警告您!)
  7. Python代码(感谢rafaponieman)可以自动完成上述步骤(未经测试的代码。已警告您!)

3
另外,如果您有模型,则必须重命名模型表。对于postgres,请使用 ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
null_radix 2012年

11
而且,如果您正在使用新的迁移,则需要在现有迁移文件和django_migrations表中更改应用程序名称。首先压缩迁移可能会更好,这样编辑起来就少了。
詹姆斯

7
对于Postgres,如果您也想重命名序列,请使用ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;。尽管没有必要,但系统本身并不关心名称。DEFAULT列存储一个OID'foo_pkey_seq'::regclass),您可以更改序列的名称而不用破坏它-OID保持不变。
康斯坦丁·卡尔巴佐夫

3
如果您将答案更新为包括James所说的有关升级迁移文件(例如依赖模块名称)的信息,那将会很好。。。。
u3l 2015年

2
这是一条管理命令,该命令允许根据@SrikarAppalaraju的解决方案重命名模型: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 它接受old_name,new_name和类作为参数(所有格式均在数据库表和字段上显示)。
rafaponieman

32

Django 1.7中的新功能是一个应用程序注册表,它存储配置并提供自省功能。通过这种机制,您可以更改几个应用程序属性。

我要提出的主要观点是,重命名应用程序并非总是必要的:通过应用程序配置,可以解决冲突的应用程序。但是,如果您的应用需要友好的命名方式,这也是可行的方法。

例如,我想将民意调查应用命名为“用户反馈”。它是这样的:

apps.pypolls目录中创建一个文件:

from django.apps import AppConfig

class PollsConfig(AppConfig):
    name = 'polls'
    verbose_name = "Feedback from users"

将默认应用配置添加到您的polls/__init__.py

default_app_config = 'polls.apps.PollsConfig'

有关更多应用程序配置:https : //docs.djangoproject.com/zh-CN/1.7/ref/applications/


13

好玩的问题!我很快将不得不重命名许多应用程序,所以我做了一次试运行。

此方法允许逐步执行进度,以最大程度地减少对正在重命名的应用程序上工作的其他开发人员的干扰。

有关有效的示例代码,请参见此答案底部的链接。

  1. 准备移动的现有代码
    • 创建一个应用程序配置(设置namelabel为默认值)。
    • 将应用程序配置添加到中INSTALLED_APPS
    • 在所有模型上,将其显式设置db_table为当前值。
    • 医生迁移,因此db_table“总是”被明确定义。
    • 确保不需要迁移(请检查上一步)。
  2. 更改应用标签

    • label在应用程序配置中设置为新的应用程序名称。
    • 更新迁移和外键以引用新的应用标签。
    • 更新基于类的通用视图的模板(默认路径为<app_label>/<model_name>_<suffix>.html
    • 运行原始SQL来修复迁移和content_types应用(不幸的是,某些原始SQL是不可避免的)。您不能在迁移中运行它。

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
      
    • 确保不需要迁移(请检查上一步)。

  3. 重命名表
    • 删除“ custom” db_table
    • 运行,makemigrations以便django可以将表重命名为“默认”。
  4. 移动文件
    • 重命名模块目录。
    • 修复导入。
    • 更新应用程序的配置name
    • 更新INSTALLED_APPS引用应用程序配置的位置。
  5. 整理
    • 如果不再需要自定义应用程序配置,请删除它。
    • 如果应用程序配置消失了,别忘了也将其从中删除INSTALLED_APPS

示例解决方案:我创建了app-rename-example这个示例项目,您可以在其中看到如何重命名应用,一次提交一次。

该示例使用Python 2.7和Django 1.8,但我相信相同的过程至少可以在Python 3.6和Django 2.1上运行。


1
谢谢@meshy。它确实帮助我重命名了一个大型应用程序。一个建议,在运行上一次迁移后,您可以删除所有迁移文件并重新创建初始迁移文件,如果您正在执行任何连续集成测试,这将对您有所帮助,否则CI将无法创建测试数据库。
罗汉

我之所以写此文件,是因为期望迁移一旦完成就可以从头开始运行。如果迁移失败,也许我们当中的一个人会错过一些东西。我会考虑一下,看看是否还需要添加其他步骤。
Meshy

@Rohan是否可以提供任何信息来详细说明迁移如何失败?
Meshy

如果您使用旧的迁移文件在本地运行测试,您会看到它将无法创建表@meshy
Rohan,

1
这个游戏计划对我来说非常理想。只要在解决下一步之前,通过所有活动的检出(CI,其他开发人员,生产等)部署每个步骤,它就可以正常工作-现有的历史迁移不会有任何问题。按顺序执行步骤,然后将更改传播到所有位置,然后再进行下一步。
user85461 '19

11

如果您使用的是PyCharm,并且项目在重命名后停止工作:

  1. 编辑运行/调试配置并更改环境变量DJANGO_SETTINGS_MODULE,因为它包含您的项目名称。
  2. 转到设置/语言和框架/ Django并更新设置文件位置。

1
这是“查找和替换”失败的情况之一。感谢您指出了这一点。
ruaanvds

0

重新迁移清洁板的方法。

如果其他应用程序没有要重命名的应用程序中的外键模型,则可以轻松完成此操作。检查并确保其迁移文件未列出此迁移中的任何迁移。

  1. 备份数据库。转储所有具有a)数据+架构的表,以获取可能的循环依赖关系,以及b)仅重新加载数据。
  2. 运行测试。
  3. 将所有代码检入VCS。
  4. 删除要重命名的应用程序的数据库表。
  5. 删除权限: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. 删除内容类型: delete from django_content_type where app_label = '<OldAppName>'
  7. 重命名应用程序的文件夹。
  8. 更改为您的应用程序的任何引用他们的依赖关系,即应用程序的views.pyurls.py“manage.py”,和settings.py文件。
  9. 删除迁移: delete from django_migrations where app = '<OldAppName>'
  10. 如果您models.py的的元类已app_name列出,请确保也将其重命名(由@will提及)。
  11. 如果您已在应用程序中为statictemplates文件夹命名空间,则还需要重命名它们。例如,重命名old_app/static/old_appnew_app/static/new_app
  12. 如果您在apps.py中定义了应用程序配置;重命名它们,然后在设置中重命名它们的引用。INSTALLED_APPS
  13. 删除迁移文件。
  14. 重新进行迁移,然后进行迁移。
  15. 从备份加载表数据。

0

如果您使用Pycharm,则通过重构所有项目文件(Shift+ F6默认值)非常容易重命名应用程序。
但是,请确保删除__pycache__项目目录及其子目录中的文件夹。也要小心,因为它也会重命名注释,您可以在重构预览窗口中将其排除在注释之外,它会向您显示。
而且,您还必须重命名您已重apps.py命名的应用程序中的OldNameConfig(AppConfig):。

如果您不想丢失数据库的数据,则必须使用上述查询中的数据库查询手动进行操作。


-3

为什么不只使用选项“查找并替换”。(每个代码编辑器都有)吗?

例如,Visual Studio代码(在“编辑”选项下):

Visual Studio代码选项:“替换文件”

您只需键入旧名称和新名称,然后单击一下即可替换项目中的所有内容。

注意:这仅重命名文件内容,而不重命名文件和文件夹名称。不要忘记重命名文件夹,例如。templates/my_app_name/重命名为templates/my_app_new_name/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.