6

文档对此问题保持沉默。命令是否会按顺序注册,以后的应用程序(按settings.INSTALLED_APPS顺序)会覆盖以前的命令(无论是来自其他应用程序的自定义命令还是内置的 Django 命令)?

4

3 回答 3

4

答案是肯定的,从当前的 1.7 版本开始。

请参阅Django 源代码中的这一行以查看逻辑的实现位置:按照每个元组的应用程序顺序,将每个应用程序的管理命令添加到命令字典(此处settings.INSTALLED_APPS使用 Django 的内置命令初始化),并带有任何给定命令名称的单个插槽,以便最后一个添加棒,覆盖任何以前的应用程序(或 Django 的内置)具有相同名称的命令;执行命令时(此处为代码),Django 使用上面的字典来决定实际使用哪个命令逻辑。

请注意,我没有找到任何有关此的文档,因此从技术上讲,它应该被视为非官方行为。

于 2015-03-28T18:31:34.467 回答
1

命令以相反的应用程序顺序注册(参见此处)。FooCommand因此,要在 appfoo中使用您自己的版本覆盖app barbar必须先于 fooin settings.INSTALLED_APPS

这是不幸的,因为您可能出于其他原因需要bar遵循foo。例如, ifbar的模型引用foo的模型。

一种解决方案是将覆盖命令拆分为单独的应用程序(如果可行)。

于 2016-01-23T23:12:48.303 回答
0

来自Django 2.2 官方文档

当多个应用程序提供相同资源(模板、静态文件、管理命令、翻译)的不同版本时,INSTALLED_APPS 中首先列出的应用程序具有优先权。

于 2019-05-06T12:13:40.393 回答