关于python:如何更改Django应用程序的名称?

How to change the name of a Django app?

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

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

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


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

  • 重命名项目根目录中的文件夹
  • 在其依赖项中更改对应用程序的任何引用,即应用程序的views.pyurls.py,"manage.py"和settings.py文件。
  • 使用以下命令编辑数据库表django_content_typeUPDATE django_content_type SET app_label='' WHERE app_label=''
  • 此外,如果您有模型,则必须重命名模型表。对于postgres使用ALTER TABLE _modelName RENAME TO _modelName。对于mysql我也认为它是相同的(如@null_radix所提到的)
  • (对于Django> = 1.7)更新django_migrations表以避免重新运行先前的迁移:UPDATE django_migrations SET app='' WHERE app=''。注意:如果Django 1.8+需要此步骤,则存在一些争论(在评论中);如果有人确切知道请在这里更新。
  • 如果models.py的元类列出app_name,请确保重命名(由@will提及)。
  • 如果您已在应用程序中命名statictemplates文件夹,则还需要重命名这些文件夹。例如,将old_app/static/old_app重命名为new_app/static/new_app
  • 要重命名django models,您需要在DB中更改django_content_type.name条目。对于postgreSQL使用UPDATE django_content_type SET name='' where name='' AND app_label=''
  • Meta点(如果使用virtualenv):值得注意的是,如果你重命名包含virtualenv的目录,你的env中可能会有几个包含绝对路径的文件,并且还需要更新。如果您遇到ImportError: No module named ...等错误,这可能是罪魁祸首。 (感谢@danyamachine提供此功能)。

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

  • 用Django和South重命名应用程序
  • 如何将模型从一个django应用程序迁移到一个新的应用程序?
  • 如何更改Django应用程序的名称?
  • 与Django South向后迁移
  • 使用Django / South重命名模型的最简单方法?
  • Python代码(感谢A.Raouf)自动执行上述步骤(未经测试的代码。您已收到警告!)
  • Python代码(感谢rafaponieman)自动执行上述步骤(未经测试的代码。您已收到警告!)

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

    我想说的重点是,并不总是需要重命名应用程序:通过应用程序配置,可以解决冲突的应用程序。但如果您的应用需要友好命名,那么还有其他方法。

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

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

    1
    2
    3
    4
    5
    from django.apps import AppConfig

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

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

    1
    default_app_config = 'polls.apps.PollsConfig'

    有关更多应用配置:https://docs.djangoproject.com/en/1.7/ref/applications/


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

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

  • 有趣的问题!我很快就要重命名很多应用程序,所以我做了一个干的运行。

    此方法允许在原子步骤中进行,以最大程度地减少在您重命名的应用程序上工作的其他开发人员的中断。

    有关工作示例代码,请参阅本答案底部的链接。

  • 为移动准备现有代码:

    • 创建应用程序配置(将namelabel设置为默认值)。
    • 将应用配置添加到INSTALLED_APPS
    • 在所有模型上,将db_table显式设置为当前值。
    • 医生迁移,以便"始终"明确定义db_table
    • 确保不需要迁移(检查上一步)。
  • 更改应用标签:

    • 将app config中的label设置为新的应用名称。
    • 更新迁移和外键以引用新的应用程序标签。
    • 更新基于通用类的视图的模板(默认路径为/_.html)
    • 运行原始SQL来修复迁移和content_types应用程序(不幸的是,一些原始SQL是不可避免的)。您无法在迁移中运行此功能。

      1
      2
      3
      4
      5
      6
      7
      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';

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

  • 重命名表格:

    • 删除"自定义"db_table
    • 运行makemigrations以便django可以将表重命名为"默认值"。
  • 移动文件:

    • 重命名模块目录。
    • 修复导入。
    • 更新应用配置的name
    • 更新INSTALLED_APPS引用应用程序配置的位置。
  • 整理:

    • 如果不再需要,请删除自定义应用配置。
    • 如果app config消失了,请不要忘记将其从INSTALLED_APPS中删除。
  • 示例解决方案:我创建了app-rename-example,这是一个示例项目,您可以在其中看到我如何重命名应用程序,一次一个提交。

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


    重新迁移更清洁板的方法。

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

  • 备份数据库。使用a)数据+模式转储所有表以获得可能的循环依赖关系,以及b)仅重新加载数据。
  • 运行测试。
  • 将所有代码检入VCS。
  • 删除要重命名的应用程序的数据库表。
  • 删除权限:delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '')
  • 删除内容类型:
  • 重命名应用程序的文件夹。
  • 在其依赖项中更改对应用程序的任何引用,即应用程序的views.pyurls.py,"manage.py"和settings.py文件。
  • 删除迁移:delete from django_migrations where app = ''
  • 如果models.py的元类列出app_name,请确保重命名(由@will提及)。
  • 如果您已在应用程序中命名statictemplates文件夹,则还需要重命名这些文件夹。例如,将old_app/static/old_app重命名为new_app/static/new_app
  • 如果您在apps.py中定义了app config;重命名这些,并在settings.INSTALLED_APPS中重命名它们的引用
  • 删除迁移文件。
  • 重新迁移和迁移。
  • 从备份加载表数据。