创建包时,如何管理弱依赖的迁移?

When creating a package, how do I manage migrations of a weak dependency?

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

有good/right管理迁移的方法吗?

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

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

由于这些模型不一定在您的包中使用,因此最好将它们放在另一个 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

注意:你必须小心,如果没有安装这个应用程序模型,你就不要导入它,否则它可能会给你一些错误,因为它不会正在加载。

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