我在Django中修改了一个应用的名字,重命名了它的文件夹、导入和所有引用(模板/索引)。但是现在,当我试图运行python manage.py runserver时,我得到了这个错误

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

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


当前回答

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/

其他回答

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

编辑运行/调试配置并更改环境变量DJANGO_SETTINGS_MODULE,因为它包含了您的项目名称。 进入Settings / Languages & Frameworks / Django,更新Settings文件的位置。

我的简单替代方案避免了手工数据库操作(类似于https://stackoverflow.com/a/64133141/1608851),在CI/CD中工作得很好,并且是可逆的。

在“旧”应用程序中创建一个空迁移,重命名表、内容类型和迁移记录。包括反向迁移。 例子:

from django.db import migrations

sql = """
ALTER TABLE oldapp_examplemodel RENAME TO newapp_examplemodel;
UPDATE django_migrations SET app ='newapp' WHERE app ='oldapp';
UPDATE django_content_type SET app_label ='newapp' WHERE app_label ='oldapp';
"""

reverse_sql = """
ALTER TABLE newapp_examplemodel RENAME TO oldapp_examplemodel;
UPDATE django_migrations SET app ='oldapp' WHERE app ='newapp';
UPDATE django_content_type SET app_label ='oldapp' WHERE app_label ='newapp';
"""


class Migration(migrations.Migration):

    dependencies = [
        ('oldapp', '0001_initial'),
    ]

    operations = [
        migrations.RunSQL(sql, reverse_sql)
    ]

将模型表名设置为new_app。 例子:

class ExampleModel(models.Model):

    # normal column definitions...

    class Meta:
        db_table = "newapp_examplemodel"  # add this line to the meta class

提交、测试和部署上述更改。 删除步骤1中创建的迁移。 重命名/移动旧应用程序并修复所有引用(参见https://stackoverflow.com/a/8408131/1608851了解更多详细信息),包括迁移中的引用。 从模型元类中删除db_table覆盖。 提交、测试和部署。

注:

The django_migrations table will retain a row with the old app, because that row is added after our new migration was run, but before it was registered under the new app name. It should be okay to leave that as is. Deleting the migration is due to the above point, but also to prevent future issues when reverse migrating, but also because Reversing this app rename requires checking out / deploying the commit from step 3, then reversing our migration, then checking out / deploying the commit before that

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

如果你不想丢失数据库中的数据,你必须手动在数据库中查询,就像前面提到的答案。

有趣的问题!我很快就要给很多应用重命名了,所以我先做了个预演。

这种方法允许在原子步骤中取得进展,以最大限度地减少对正在重命名应用程序的其他开发人员的干扰。

请参阅答案底部的链接,以获得工作示例代码。

Prepare existing code for the move: Create an app config (set name and label to defaults). Add the app config to INSTALLED_APPS. On all models, explicitly set db_table to the current value. Doctor migrations so that db_table was "always" explicitly defined. Ensure no migrations are required (checks previous step). Change the app label: Set label in app config to new app name. Update migrations and foreign keys to reference new app label. Update templates for generic class-based views (the default path is <app_label>/<model_name>_<suffix>.html) Run raw SQL to fix migrations and content_types app (unfortunately, some raw SQL is unavoidable). 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'; Ensure no migrations are required (checks previous step). Rename the tables: Remove "custom" db_table. Run makemigrations so django can rename the table "to the default". Move the files: Rename module directory. Fix imports. Update app config's name. Update where INSTALLED_APPS references the app config. Tidy up: Remove custom app config if it's no longer required. If app config gone, don't forget to also remove it from INSTALLED_APPS.


示例解决方案:我已经创建了app-rename- Example,一个示例项目,在这里你可以看到我如何重命名一个应用程序,一次提交一次。

这个例子使用的是Python 2.7和Django 1.8,但我相信同样的过程至少可以在Python 3.6和Django 2.1上工作。

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/