问题:如何更改Django应用的名称?
我通过重命名应用程序的文件夹,导入及其所有引用(模板/索引)来更改了Django中应用程序的名称。但是现在当我尝试运行时出现此错误python manage.py runserver
Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings
如何调试和解决此错误?有什么线索吗?
回答 0
请按照以下步骤在Django中更改应用的名称:
- 重命名项目根目录中的文件夹
- 更改为您的应用程序的任何引用他们的依赖关系,即应用程序的
views.py
,urls.py
“manage.py”,和settings.py
文件。 django_content_type
使用以下命令编辑数据库表:UPDATE 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>'
。注意:对于Django 1.8+是否需要执行此步骤,存在一些参数(在注释中)。如果有人知道,请在这里更新。 - 如果您
models.py
的的元类已app_name
列出,请确保也将其重命名(由@will提及)。 - 如果您已在应用程序中为
static
或templates
文件夹命名空间,则还需要重命名它们。例如,重命名old_app/static/old_app
为new_app/static/new_app
。 - 要重命名django
models
,您需要更改django_content_type.name
DB中的条目。对于PostgreSQL使用UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
元点(如果使用virtualenv):值得注意的是,如果要重命名包含virtualenv的目录,则env中可能有几个文件包含绝对路径,并且也需要更新。如果您遇到诸如此类的错误,ImportError: No module named ...
可能是罪魁祸首。(感谢@danyamachine提供此功能)。
其他参考:您可能还想参考以下链接以获得更完整的图片
- 使用Django和South重命名应用程序
- 如何将模型从一个django应用程序迁移到新的模型中?
- 如何更改Django应用的名称?
- 使用Django South向后迁移
- 使用Django / South重命名模型的最简单方法?
- Python代码(感谢A.Raouf)可以自动完成上述步骤(未经测试的代码。已警告您!)
- Python代码(感谢rafaponieman)可以自动完成上述步骤(未经测试的代码。已警告您!)
回答 1
Django 1.7中的新功能是一个应用程序注册表,它存储配置并提供自省功能。通过这种机制,您可以更改几个应用程序属性。
我要提出的主要观点是,重命名应用程序并非总是必要的:通过应用程序配置,可以解决冲突的应用程序。但是,如果您的应用需要友好的命名方式,这也是可行的方法。
例如,我想将民意调查应用命名为“用户反馈”。它是这样的:
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/zh-CN/1.7/ref/applications/
回答 2
好玩的问题!我很快将不得不重命名许多应用程序,所以我做了一次试运行。
此方法允许逐步执行进度,以最大程度地减少对正在重命名的应用程序上工作的其他开发人员的干扰。
有关有效的示例代码,请参见此答案底部的链接。
- 准备移动的现有代码:
- 创建一个应用程序配置(设置
name
和label
为默认值)。 - 将应用程序配置添加到中
INSTALLED_APPS
。 - 在所有模型上,将其显式设置
db_table
为当前值。 - 医生迁移,因此
db_table
“总是”被明确定义。 - 确保不需要迁移(请检查上一步)。
- 创建一个应用程序配置(设置
更改应用标签:
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';
确保不需要迁移(请检查上一步)。
- 重命名表:
- 删除“ custom”
db_table
。 - 运行,
makemigrations
以便django可以将表重命名为“默认”。
- 删除“ custom”
- 移动文件:
- 重命名模块目录。
- 修复导入。
- 更新应用程序的配置
name
。 - 更新
INSTALLED_APPS
引用应用程序配置的位置。
- 整理:
- 如果不再需要自定义应用程序配置,请删除它。
- 如果应用程序配置消失了,别忘了也将其从中删除
INSTALLED_APPS
。
示例解决方案:我创建了app-rename-example这个示例项目,您可以在其中看到如何重命名应用,一次提交一次。
该示例使用Python 2.7和Django 1.8,但我相信相同的过程至少可以在Python 3.6和Django 2.1上运行。
回答 3
如果您使用的是PyCharm,并且项目在重命名后停止工作:
- 编辑运行/调试配置并更改环境变量DJANGO_SETTINGS_MODULE,因为它包含您的项目名称。
- 转到设置/语言和框架/ Django并更新设置文件位置。
回答 4
重新迁移清洁板的方法。
如果其他应用程序没有要重命名的应用程序中的外键模型,则可以轻松完成此操作。检查并确保其迁移文件未列出此迁移中的任何迁移。
- 备份数据库。转储所有具有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.py
,urls.py
“manage.py”,和settings.py
文件。 - 删除迁移:
delete from django_migrations where app = '<OldAppName>'
- 如果您
models.py
的的元类已app_name
列出,请确保也将其重命名(由@will提及)。 - 如果您已在应用程序中为
static
或templates
文件夹命名空间,则还需要重命名它们。例如,重命名old_app/static/old_app
为new_app/static/new_app
。 - 如果您在apps.py中定义了应用程序配置;重命名它们,然后在设置中重命名它们的引用。INSTALLED_APPS
- 删除迁移文件。
- 重新进行迁移,然后进行迁移。
- 从备份加载表数据。
回答 5
如果您使用Pycharm,则通过重构所有项目文件(Shift
+ F6
默认值)非常容易重命名应用程序。
但是,请确保删除__pycache__
项目目录及其子目录中的文件夹。也要小心,因为它也会重命名注释,您可以在重构预览窗口中将其排除在注释之外,它会向您显示。
而且,您还必须重命名您已重apps.py
命名的应用程序中的OldNameConfig(AppConfig):。
如果您不想丢失数据库的数据,则必须使用上述查询中的数据库查询手动进行操作。
回答 6
为什么不只使用选项“查找并替换”。(每个代码编辑器都有)吗?
例如,Visual Studio代码(在“编辑”选项下):
您只需键入旧名称和新名称,然后单击一下即可替换项目中的所有内容。
注意:这仅重命名文件内容,而不重命名文件和文件夹名称。不要忘记重命名文件夹,例如。templates/my_app_name/
重命名为templates/my_app_new_name/