如何更改Django应用程序的名称?

时间:2011-12-06 22:51:04

标签: python django

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

时,我发现此错误
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

如何调试并解决此错误?有线索吗?

8 个答案:

答案 0 :(得分:227)

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

  1. 重命名项目根目录中的文件夹
  2. 在其依赖项中更改对您的应用的任何引用,即应用的views.pyurls.py,'manage.py'和settings.py文件。
  3. 使用以下命令编辑数据库表django_content_typeUPDATE 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&gt; = 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_app重命名为new_app/static/new_app
  8. 要重命名django models,您需要在DB中更改django_content_type.name条目。对于postgreSQL使用UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
  9. Meta点(如果使用virtualenv):值得注意的是,如果你重命名包含virtualenv的目录,你的env中可能会有几个包含绝对路径的文件,也需要要被更新。如果您收到诸如ImportError: No module named ...之类的错误,这可能是罪魁祸首。 (感谢@danyamachine提供此功能)。

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

    1. Renaming an app with Django and South
    2. How do I migrate a model out of one django app and into a new one?
    3. How to change the name of a Django app?
    4. Backwards migration with Django South
    5. Easiest way to rename a model using Django/South?
    6. Python code(感谢A.Raouf)自动执行上述步骤(未经测试的代码。您已收到警告!)
    7. Python code(感谢rafaponieman)自动执行上述步骤(未经测试的代码。您已收到警告!)

答案 1 :(得分:27)

Django 1.7中的新功能是一个应用程序注册表,用于存储配置并提供内省。这个机器让你改变几个应用程序属性。

我想说的是,重命名应用程序并不总是必要的:使用应用程序配置,可以解决冲突的应用程序。如果你的应用需要友好的命名,那也是你要走的路。

作为一个例子,我想命名我的民意调查应用程序&#39;来自用户的反馈&#39;。它是这样的:

apps.py目录中创建polls文件:

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/en/1.7/ref/applications/

答案 2 :(得分:8)

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

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

答案 3 :(得分:4)

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

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

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

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

    • 在应用配置中将label设置为新的应用名称。
    • 更新迁移和外键以引用新的应用标签。
    • 更新基于通用类的视图(default path is <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. 重命名表格
    • 删除“自定义” 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上运行。

答案 4 :(得分:1)

在许多情况下,我相信@allcaps的answer效果很好。

但是,有时有必要对应用进行重命名,例如提高代码的可读性或防止混淆。

大多数其他答案涉及manual database manipulationtinkering with existing migrations,我不太喜欢。

作为替代方案,我想用所需的名称创建一个新应用,将所有内容复制过来,确保其可以正常工作,然后删除原始应用:

  1. 使用所需名称启动 new 应用,然后将所有代码从原始应用复制到该应用中。确保您在新复制的代码中修复了带名称空间的内容,以使其与新的应用程序名称匹配。

  2. makemigrationsmigrate

  3. 创建一个data migration,将相关数据从原始应用程序的表复制到新应用程序的表中,然后再次migrate

这时,一切仍然有效,因为原始应用及其数据仍然存在。

  1. 现在您可以重构所有相关代码,因此它仅使用新应用程序。有关其他注意事项的示例,请参见其他答案。

  2. 确定一切正常后,就可以删除原始应用。

这样做的好处是,每个步骤都使用常规的Django迁移机制,而无需手动进行数据库操作,并且我们可以跟踪源代码控制中的所有内容。此外,我们将原始应用程序及其数据保留在适当的位置,直到我们确定一切正常为止。

答案 5 :(得分: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_app重命名为new_app/static/new_app
  12. 如果您在apps.py中定义了应用配置;重命名这些,并在settings.INSTALLED_APPS
  13. 中重命名它们的引用
  14. 删除迁移文件。
  15. 重新迁移和迁移。
  16. 从备份加载表数据。

答案 6 :(得分:0)

如果您使用 Pycharm ,则可以对所有项目文件进行重构(默认为mysqldump --add-drop-table -u root --password='xxxxxxxx' nav | sed -e 's/CHARSET\=latin1/CHARSET\=utf8\ COLLATE\=utf8_general_ci/g' | iconv -f latin1 -t utf8 | mysql -u root --password='xxxxxxx' nav + Shift)来重命名应用程序。< br /> 但是,请确保删除项目目录及其子目录中的F6文件夹。也要小心,因为它也会重命名注释,您可以在重构预览窗口中排除它,它会向您显示。
另外,您还必须在已重命名的应用程序的__pycache__中重命名OldNameConfig(AppConfig):。

如果您不想丢失数据库的数据,则必须像上述答案一样手动对数据库进行查询。

答案 7 :(得分:-5)

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

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

Visual Studio Code option: 'Replace in files'

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

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