微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

我不能在包中包含依赖于 CMSPlugin 的模型迁移,因为没有 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。