首页 文章

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

提问于
浏览
102

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

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

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

5 回答

  • 205

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

    • 重命名项目根目录中的文件夹

    • 在其依赖项中更改对您的应用程序的任何引用,即应用程序的 views.pyurls.py ,'manage.py'和 settings.py 文件 .

    • 使用以下命令编辑数据库表 django_content_typeUPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'

    • 此外,如果您有模型,则必须重命名模型表 . 对于postgres使用 ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . 对于mysql我也认为它是相同的(如@null_radix所述)

    • (对于Django> = 1.7)更新 django_migrations 表以避免重新运行先前的迁移: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Note :如果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='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

    Meta point (If using virtualenv): 值得注意的是,如果你重命名包含virtualenv的目录,你的env中可能会有几个包含绝对路径的文件,并且还需要更新 . 如果你收到错误,如 ImportError: No module named ... ,这可能是罪魁祸首 . (感谢@danyamachine提供此功能) .

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

  • 7

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

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

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

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

    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/

  • 0

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

    • 编辑运行/调试配置并更改环境变量DJANGO_SETTINGS_MODULE,因为它包含您的项目名称 .

    • 转到设置/语言和框架/ Django并更新设置文件位置 .

  • 3

    有趣的问题!我将很快重新命名很多应用程序,所以我做了一个干 .

    此方法允许在原子步骤中进行,以最大程度地减少对您正在重命名的应用程序的其他开发人员的干扰 .

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

    • Prepare existing code for the move

    • 创建app config(将 namelabel 设置为默认值) .

    • 将应用程序配置添加到 INSTALLED_APPS .

    • 在所有型号上,将 db_table 显式设置为当前值 .

    • 医生迁移,以便明确定义 db_table "always" .

    • 确保不需要迁移(检查上一步) .

    • Change the app label

    • 将app config中的 label 设置为新的应用名称 .

    • 更新迁移和外键以引用新的应用程序标签 .

    • 更新基于通用类的视图的模板(default path is <app_label>/<model_name>_<suffix>.html

    • 运行原始SQL以修复迁移和 content_types app(不幸的是,一些原始SQL是不可避免的) . You can not run this in a migration.

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

    • Rename the tables

    • 删除"custom" db_table .

    • 运行 makemigrations 所以django可以重命名表"to the default" .

    • Move the files

    • 重命名模块目录 .

    • 修复导入 .

    • 更新应用配置 name .

    • 更新 INSTALLED_APPS 引用应用程序配置的位置 .

    • Tidy up

    • 如果不再需要,请删除自定义应用配置 .

    • 如果app config消失了,请不要忘记将其从 INSTALLED_APPS 中删除 .


    Example solution: 我创建了app-rename-example,这是一个示例项目,您可以在其中看到我如何重命名应用程序,一次一个提交 .

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

  • 25

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

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

    • 备份数据库 . 转储具有a)数据模式的所有表以获得可能的循环依赖性,以及b)仅用于重新加载的数据 .

    • 运行测试 .

    • 将所有代码检入VCS .

    • 删除要重命名的应用程序的数据库表 .

    • 删除权限: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')

    • 删除内容类型: delete from django_content_type where app_label = '<OldAppName>'

    • 重命名应用程序的文件夹 .

    • 在其依赖项中更改对您的应用程序的任何引用,即应用程序的 views.pyurls.py ,'manage.py'和 settings.py 文件 .

    • 删除迁移: delete from django_migrations where app = '<OldAppName>'

    • 如果您的 models.py 的元类已列出 app_name ,请务必重命名(由@will提及) .

    • 如果您在应用程序中命名了 statictemplates 文件夹,则还需要重命名这些文件夹 . 例如,将 old_app/static/old_app 重命名为 new_app/static/new_app .

    • 如果您在apps.py中定义了app config;重命名它们,并在settings.INSTALLED_APPS中重命名它们的引用

    • 删除迁移文件 .

    • 重新进行迁移和迁移 .

    • 从备份加载表数据 .

相关问题