Django 的单例架构是否使其无法作为库中的独立 ORM 使用?

the*_*man 10 python django orm django-models django-orm

我喜欢 Django ORM。它简单、易于使用且功能相当强大。

我目前正在为我工​​作的 VFX 公司开发一些内部网站,为此我使用了 Django。与此同时,我们正在开发其他 Python 应用程序和库,以用于生产中的各种上下文。我们的核心库在很多地方需要与一些数据库进行交互,使用像 Django 这样的 ORM 真的会有所帮助。我知道其他选项,如 SqlAlchemy 或 PeeWee,但我想看看 Django 是否可以工作,因为我在网站上使用它并且我更喜欢它的 API。

在库中使用 Django 作为 ORM 很棘手(正如我在上一个问题中探讨的那样),因为 Django 希望被用作带有“应用程序”的网站。在库中,我可能想要定义任意数量的数据模型,这些模型将存在于库中的适当位置,但不在任何 Django 应用程序中(因为我们没有使用框架的任何其他部分)。到现在为止还挺好。

我可以在库中的任何位置为我的模型创建一个基类,如下所示:

from django.db import models
from django.apps import apps
import django.conf

django.conf_settings.configure(
    DATABASES = ...
)

apps.populate((__name__,))

class LibModel(models.Model):
    class Meta:
        abstract = True
        app_label = __name__
Run Code Online (Sandbox Code Playgroud)

然后我可以在库中的任何地方使用这个基类创建我自己的模型。由于我不依赖于数据库名称的“应用程序”,因此我需要明确说明它们。

class SpecificModel(LibModel):
    # fields go here
    class Meta(LibModel.Meta):
        db_table = "specific_model_table_name"
Run Code Online (Sandbox Code Playgroud)

这解决了我对必须模拟“应用程序”结构的担忧。基类中的name属性为 Django 提供了它需要的一切,然后 Django 不再抱怨找不到应用程序。其他模型文件可以放在任何他们想要的地方。

然而,有一个明显的用例,这一切都分崩离析。假设我的 Django Web 应用程序想要使用公司核心 Python 库中的一些功能,该库现在将 Django ORM 用于各种用途。由于我调用了库中的 django.conf.settings.configure,Django 在尝试运行主应用程序时会不止一次地抱怨定义设置。

所以基本上,使用 Django ORM 的库与 Django 不兼容。精彩的。

有没有办法解决?我的意思是,这是一个可爱的 ORM - 以独立的模块化方式使用真的不可能吗?Django 架构在本质上是完全单例的吗?

*不是重复 我试图拥有一个使用 Django 作为 ORM 的公司 python 库。一些可能依赖于它的东西可能是 Django 网站本身。我如何绕过 Django 的单例坚持只设置一次设置配置?或者有可能吗?这些答案都没有解决这个问题!

Ole*_*kin 2

您可以检查 django 是否已经配置。

from django.apps import apps
from django.conf import settings

if not apps.ready:
    settings.configure()
    django.setup()
Run Code Online (Sandbox Code Playgroud)

启动 Django 应用程序时 - 核心 python 库可以配置为单独的应用程序并在启动时加载。

另外,请检查有关运行时动态应用程序加载的答案。