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 |
如何调试并解决此错误? 有线索吗?
-
你有更新settings.py吗?
-
嗨danihp。 是的,我有。 我也在使用virtualenv,我不知道如果这与某些事情有关。
-
如果您使用PyCharm,它的rename功能将极大地帮助您解决这个问题。
-
是不是南方支持这样的行动?
-
@andi stackoverflow.com/questions/4566978/
按照以下步骤更改Django中的应用程序名称:
重命名项目根目录中的文件夹
在其依赖项中更改对应用程序的任何引用,即应用程序的views.py,urls.py,"manage.py"和settings.py文件。
使用以下命令编辑数据库表django_content_type:UPDATE 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提及)。
如果您已在应用程序中命名static或templates文件夹,则还需要重命名这些文件夹。例如,将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)自动执行上述步骤(未经测试的代码。您已收到警告!)
-
嗨,这个错误是由于应用程序的名称与项目的名称相同...感谢您的帮助。
-
此外,如果您有模型,则必须重命名模型表。对于postgres使用ALTER TABLE _modelName RENAME TO _modelName
-
如何更改tableName_id_seq的名称?
-
那么name列对应于模型的名称,app_label对应于应用程序的名称?最后一栏,型号怎么样?
-
如果使用fixture,请在oldAppName上执行查找和替换。到newAppName。在固定装置内。
-
如果您的Models.py的Meta Class列出了'app_name',请确保将其重命名
-
如果您正在使用新迁移,则需要在现有迁移文件和django_migrations表中更改应用名称。首先压缩迁移可能会更好,因此编辑的次数较少。
-
对于Postgres,如果您也想重命名序列,请使用ALTER SEQUENCE ___seq RENAME TO ___seq;。虽然没有必要,但系统本身并不关心名称。列DEFAULT存储OID('foo_pkey_seq'::regclass),您可以更改序列的名称而不会破坏它 - OID保持不变。
-
Homebrew for Mac是否有相同的功能?我一直在我的终端:"未找到UPDATE命令"。
-
如果你更新你的答案以包括詹姆斯关于升级迁移文件(例如依赖模块名称)的说法,那就太棒了......无法解决这个问题。
-
@ uj-在第6点的答案中已经提到了。
-
关于#5,重命名模型:我认为你的意思是model而不是name。该表上没有name列(我在Django 1.8上),只有[id,app_label和model]。
-
@TheGrimmScientist为我们的用户提供Django 1.8+我认为我们必须跳过第5步吧?
-
值得注意的是,如果您要重命名包含virtualenv的目录:您的env中可能会有几个文件包含绝对路径,并且还需要更新。如果您遇到ImportError: No module named ...等错误,这可能是罪魁祸首。
-
我试着在这里实现你的答案github.com/amirraouf/change-django-app-name
-
这是一个管理命令,允许根据@ SrikarAppalaraju的解决方案进行模型重命名:gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5它接受old_name,new_name和类作为参数(所有格式都在数据库表和字段上查看)。
-
我们如何处理迁移?
-
有什么理由不使用ORM重命名ContentType和Migrations模型?
-
stackoverflow.com/a/45007732/875379中的方法似乎更简单。
-
作为最后一步,我不得不删除并重新制作迁移(django 2.1.1)
-
重命名后,您还可以运行manage.py migrate --fake 一次。这样,您的迁移历史记录会显示旧的应用迁移以及新的迁移。
-
我在Django 2.2上,对于第8步,我没有看到表django_content_type有一个名为name的列。我看到的唯一列是id,app_label和model。
-
@chefarov为了保留迁移历史记录,我通过sed运行了所有迁移文件,更改了对应用程序名称的所有引用。
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并更新设置文件位置。
-
这是查找和替换失败的情况之一。感谢您指出了这一点。
有趣的问题!我很快就要重命名很多应用程序,所以我做了一个干的运行。
此方法允许在原子步骤中进行,以最大程度地减少在您重命名的应用程序上工作的其他开发人员的中断。
有关工作示例代码,请参阅本答案底部的链接。
为移动准备现有代码:
-
创建应用程序配置(将name和label设置为默认值)。
-
将应用配置添加到INSTALLED_APPS。
-
在所有模型上,将db_table显式设置为当前值。
-
医生迁移,以便"始终"明确定义db_table。
-
确保不需要迁移(检查上一步)。
更改应用标签:
重命名表格:
-
删除"自定义"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上运行。
-
谢谢@meshy。它真的帮助我重命名一个巨大的应用程序。一个建议是,在运行上次迁移后,您可以删除所有迁移文件并重新创建初始迁移文件,如果您正在进行任何持续集成测试,这将有助于您,否则CI将无法创建测试数据库。
-
我写这篇文章是为了期望迁移一旦完成就可以从头开始运行。如果迁移失败,也许我们中的一个人错过了什么。我会考虑一下,看看是否还有其他需要添加的步骤。
-
@Rohan是否有任何可以提供的信息来详细说明迁移失败的原因?
-
如果使用旧的迁移文件在本地运行测试,则可以看到它将无法创建表@meshy
-
完成所有步骤后,无需保留旧的迁移文件,因为数据库现在具有不同的表名。因此,您可以再添加一个删除所有迁移文件的步骤,然后重新运行makemigrations命令以生成与数据库表一致的新迁移文件。 @meshy。但是你仍然很好地解决了这个问题。谢谢你。
-
别客气!我很高兴它对你有用:)谢谢你的额外信息。对于我的用例,保持迁移很重要,所以我会在某个时候回到这个问题,并尝试解决这个问题。
重新迁移更清洁板的方法。
如果其他应用程序不重命名应用程序中的外键模型,则可以轻松完成。检查并确保其迁移文件未列出此迁移文件的任何迁移。
备份数据库。使用a)数据+模式转储所有表以获得可能的循环依赖关系,以及b)仅重新加载数据。
运行测试。
将所有代码检入VCS。
删除要重命名的应用程序的数据库表。
删除权限:delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '')
删除内容类型:
重命名应用程序的文件夹。
在其依赖项中更改对应用程序的任何引用,即应用程序的views.py,urls.py,"manage.py"和settings.py文件。
删除迁移:delete from django_migrations where app = ''
如果models.py的元类列出app_name,请确保重命名(由@will提及)。
如果您已在应用程序中命名static或templates文件夹,则还需要重命名这些文件夹。例如,将old_app/static/old_app重命名为new_app/static/new_app。
如果您在apps.py中定义了app config;重命名这些,并在settings.INSTALLED_APPS中重命名它们的引用
删除迁移文件。
重新迁移和迁移。
从备份加载表数据。