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

Python 创建包时,如何管理弱依赖项的迁移?,python,django,django-models,django-cms,Python,Django,Django Models,Django Cms,我有一个Django应用程序,我想通过Pipy打包并提供给社区。它唯一强烈的依赖性是Django。它还与Django CMS进行了很好的集成,并为Django CMS提供了额外的集成。我计划仅向安装了Django CMS的项目提供此附加功能。(这就是我所说的弱依赖性——在没有它的情况下可以安装和工作,但在使用它的情况下甚至可以工作。)具体地说,只有安装了Django CMS的基本模型CMSPlugin,才能定义一些模型 但是,有没有好的/正确的方法来管理迁移? 我不能在包中包含依赖于CMSPlu

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

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

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


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

由于这些模型不一定在包中使用,因此最好在另一个Django应用程序中使用它们,它可以是应用程序的子应用程序,也可以只是程序包中的一个应用程序。如果用户已经安装了
CMSPlugin
,那么他们现在只需将您的这个额外应用添加到
installed\u APPS
列表中即可使用它,这还有一个好处,即您的用户现在可以选择是否使用它

通过使用应用注册中心,无论是否安装了此应用,您都可以轻松调整视图:

注意:您必须小心,如果未安装此应用程序,请不要导入此应用程序模型,否则它可能会给您一些错误,因为它不会被加载


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

我能想到的一件事是在你的软件包的子应用程序中有这些额外的模型,也就是说,如果用户想使用它,他们必须将它显式地添加到
已安装的应用程序中(Django中的应用程序非常常见,例如
Django.contrib.humanize
)谢谢!这听起来比我使用的
try-import-except importorror
好得多。完整性的一点是:创建子应用程序,我将它cd到应用程序目录中,然后运行
python../manage.py startapp subappname
,并通过将名称设置为
app.sub\u app
来修改子应用程序的
apps.py
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