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

And*_*dré 129 python django

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

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

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

Sri*_*aju 245

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

  1. 重命名项目根目录中的文件夹
  2. 更改为您的应用程序的任何引用他们的依赖关系,即应用程序的views.py,urls.py"manage.py",和settings.py文件.
  3. django_content_type使用以下命令编辑数据库表:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. 此外,如果您有模型,则必须重命名模型表.适合postgres使用ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName.对于mysql我也认为它是相同的(如@null_radix所提到的)
  5. (对于Django> = 1.7)更新django_migrations表以避免重新运行先前的迁移:UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'.注意:如果Django 1.8+需要此步骤,则存在一些争论(在评论中); 如果有人确切知道请在这里更新.
  6. 如果您models.py的元类已app_name列出,请确保也重命名(由@will提及).
  7. 如果您已将应用程序中的文件夹statictemplates文件夹命名为,则还需要重命名.例如,重命名old_app/static/old_appnew_app/static/new_app.
  8. 要重命名django models,您需要更改django_content_type.nameDB中的条目.对于postgreSQL使用UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

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

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

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

  • 如果您正在使用新迁移,则需要在现有迁移文件和django_migrations表中更改应用名称.首先压缩迁移可能会更好,因此编辑的次数较少. (10认同)
  • 对于Postgres,如果要重命名序列,则使用`ALTER SEQUENCE <oldAppName> _ <modelName> _ <PK> _seq RENAME TO <newAppName> _ <modelName> _ <PK> _seq;`.虽然没有必要,但系统本身并不关心名称.列DEFAULT存储一个`OID`(`'foo_pkey_seq':: regclass`),您可以更改序列的名称而不会破坏它 - OID保持不变. (6认同)
  • 此外,如果您有模型,则必须重命名模型表.对于postgres使用`ALTER TABLE <oldAppName> _modelName RENAME TO <newAppName> _modelName` (3认同)
  • 如果你更新你的答案以包括詹姆斯关于升级迁移**文件**(例如依赖模块名称)的内容,那将是很好的......无法解决这个问题. (3认同)
  • 这是一个管理命令,允许根据@ SrikarAppalaraju的解决方案进行模型重命名:https://gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5它接受old_name,new_name和类作为参数(所有格式都在数据库表和字段上查看) . (2认同)

all*_*aps 30

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

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

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

apps.pypolls目录中创建一个文件:

from django.apps import AppConfig

class PollsConfig(AppConfig):
    name = 'polls'
    verbose_name = "Feedback from users"
Run Code Online (Sandbox Code Playgroud)

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

default_app_config = 'polls.apps.PollsConfig'
Run Code Online (Sandbox Code Playgroud)

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


Maz*_* Mk 10

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

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


mes*_*shy 7

好玩的问题!我很快将不得不重命名许多应用程序,所以我做了一次试运行。

通过此方法,可以在原子步骤中取得进展,以最大程度地减少对正在重命名的应用程序上工作的其他开发人员的干扰。

有关有效的示例代码,请参见此答案底部的链接。

  1. 准备移动的现有代码
    • 创建一个应用程序配置(设置namelabel为默认值)。
    • 将应用程序配置添加到中INSTALLED_APPS
    • 在所有模型上,将其显式设置db_table为当前值。
    • 医生迁移,因此db_table“总是”被明确定义。
    • 确保不需要迁移(请检查上一步)。
  2. 更改应用标签

    • 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';
      
      Run Code Online (Sandbox Code Playgroud)
    • 确保不需要迁移(请检查上一步)。

  3. 重命名表
    • 删除“ custom” db_table
    • 运行,makemigrations以便django可以将表重命名为“默认”。
  4. 移动文件
    • 重命名模块目录。
    • 修复导入。
    • 更新应用程序的配置name
    • 更新INSTALLED_APPS引用应用程序配置的位置。
  5. 整理
    • 如果不再需要自定义应用程序配置,请删除它。
    • 如果应用程序配置消失了,别忘了也将其从中删除INSTALLED_APPS

示例解决方案:我创建了app-rename-example这个示例项目,您可以在其中查看如何重命名应用,一次提交一次。

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


djv*_*jvg 5

在许多情况下,我相信@allcaps 的回答很有效。

但是,有时需要实际重命名应用程序,例如提高代码可读性或防止混淆。

大多数其他答案涉及手动数据库操作修补现有迁移,我不太喜欢这些。

作为替代方案,我喜欢创建一个具有所需名称的新应用程序,复制所有内容,确保其正常工作,然后删除原始应用程序:

  1. 使用所需名称启动一个应用程序,并将原始应用程序中的所有代码复制到该应用程序中。确保在新复制的代码中修复命名空间的内容,以匹配新的应用程序名称。

  2. makemigrationsmigrate。注意:如果应用程序有很多外键,则在尝试为复制的应用程序运行初始迁移时,可能会出现反向访问器冲突的问题。您必须重命名旧应用程序上的 related_name 访问器(或添加新访问器)以解决冲突。

  3. 创建一个数据迁移,将相关数据从原始应用程序的表复制到新应用程序的表中,然后migrate再复制一次。

此时,一切仍然有效,因为原始应用程序及其数据仍然存在。

  1. 现在你可以重构所有的依赖代码,所以它只使用新的应用程序。有关需要注意的事项的示例,请参阅其他答案。

  2. 一旦确定一切正常,您就可以删除原始应用程序。这涉及另一个(架构)迁移。

这样做的好处是每一步都使用正常的Django迁移机制,无需手动操作数据库,我们可以在源代码控制中跟踪所有内容。此外,我们会保留原始应用程序及其数据,直到我们确定一切正常。

  • 这似乎是比这里提到的其他方法更干净的方法。 (3认同)