【问题标题】:If multiple Django apps define the same custom management command, which is used?如果多个 Django 应用定义了相同的自定义管理命令,使用哪个?
【发布时间】:2015-03-28 17:14:33
【问题描述】:

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

【问题讨论】:

    标签: python django manage.py


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      命令以 reverse 应用顺序注册(请参阅here)。因此,要在应用程序foo 中使用您自己的版本在应用程序bar 中覆盖FooCommandbar 必须先于 foo in settings.INSTALLED_APPS

      这很不幸,因为您可能出于其他原因需要bar 关注foo。例如,如果 bar 的模型引用 foo 的模型。

      如果可行,一种解决方案是将覆盖命令拆分到一个单独的应用程序中。

      【讨论】:

        【解决方案3】:

        来自Django 2.2 official documentation

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-19
          • 2016-03-28
          • 2019-01-09
          • 2019-09-24
          • 2018-01-21
          • 2017-09-05
          • 2016-07-09
          • 2012-08-28
          相关资源
          最近更新 更多