【问题标题】:When creating a package, how do I manage migrations of a weak dependency?创建包时,如何管理弱依赖的迁移?
【发布时间】:2026-02-16 14:15:01
【问题描述】:

我有一个 Django 应用程序,我想通过 Pipy 打包并提供给社区。它唯一的强依赖是 Django。它还与 Django CMS 很好地集成,并为 Django CMS 提供了额外的集成。我计划仅向安装了 Django CMS 的项目提供此附加功能。 (这就是我所说的弱依赖——没有它就可以安装和工作,但使用它会更痛苦。)具体来说,某些模型只有在 Django CMS 的基本模型 CMSPlugin 是已安装。

有没有好的/正确的方法来管理迁移?

我不能在包中包含依赖于CMSPlugin 的模型迁移,因为没有安装 Django CMS 的用户将无法运行它。

如果我省略了依赖于CMSPlugin 的迁移,使用 Django CMS 的用户将在首次安装时创建它们。然而,我担心,在包的每次更新中,当包被覆盖时,这些迁移将在pip install upgrade 上丢失。

【问题讨论】:

  • 我能想到的一件事是在你的包的子应用程序中拥有这些额外的模型,即如果用户想要使用它,他们必须明确地将它添加到INSTALLED_APPS(很常见在 Django 中的应用程序中看到,例如 django.contrib.humanize)

标签: python django django-models django-cms


【解决方案1】:

由于这些模型不一定在您的包中使用,因此最好将它们放在另一个 Django 应用程序中,该应用程序可以是您的应用程序的子应用程序,也可能只是您包中存在的应用程序之一。如果用户安装了CMSPlugin,那么他们现在只需将您的这个额外应用添加到INSTALLED_APPS 列表即可使用它,这也带来了您的用户现在可以选择使用或不使用它的好处。

这样,无论是否安装了此应用,您都可以使用应用注册表is_installed method [Django docs]轻松调整您的视图:

from django.apps import apps


def some_view(request):
    if apps.is_installed('yourpackage.path.to.weak_dependency_subapp'):
        # Weak dependency is present
    else:
        # Weak dependency is absent

注意:请注意,如果未安装此应用模型,请不要导入它,否则可能会出现错误,因为它不会加载。 p>

编辑:要制作子应用程序,您可以通过 cd'ing 到应用程序目录和python ../manage.py startapp subappname 或直接python manage.py startapp subappname <your_app>/subappname (需要制作目录子应用程序名称)首先)然后将其应用配置的name 属性设置为<your_app>.subappname

【讨论】:

  • 谢谢!这听起来比我使用的 try - import - except ImportError 要好得多。
  • 为了完整性的一点小事:为了创建子应用程序,我 cd'd 到应用程序的目录并运行 python ../manage.py startapp subappname 并通过将名称设置为 app.sub_app 来修改子应用程序的 apps.py .
最近更新 更多