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

问题描述 投票:4回答:1

我喜欢Django ORM。它简单,易用且功能强大。

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

使用Django作为库中的ORM是棘手的(正如我在previous question中所探讨的,因为Django希望与“ apps”一起用作网站。在一个库中,我可能想定义任意数量的数据模型,这些数据模型将存在于库中的适当位置,而不存在于任何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__

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

class SpecificModel(LibModel):
    # fields go here
    class Meta(LibModel.Meta):
        db_table = "specific_model_table_name"

这绕开了我对必须模拟“应用”结构的关注。基类中的name属性为Django提供了所需的一切,然后Django不再抱怨找不到应用程序。其他模型文件可以存放在任意位置。

但是,有一个非常明显的用例,其中的所有这些都消失了。假设我的Django Web应用程序要使用公司核心python库中的某些功能,该库现在将Django ORM用于各种用途。由于我在库中调用了django.conf.settings.configure,因此Django在尝试运行主应用程序时会大声疾呼地定义设置。

因此,基本上,使用Django ORM的库与Django不兼容。很棒。

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

*非重复项我正在尝试使用Django作为ORM的公司python库。可能依赖它的某些东西可能是Django网站本身。如何避免Django仅设置一次设置config的单例坚持?还是可能吗? 这些答案都没有解决这个问题!

python django django-models orm django-orm
1个回答
0
投票

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

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

if not apps.ready:
    settings.configure()
    django.setup()

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

另外,请在运行时动态加载应用程序时检查this answer

© www.soinside.com 2019 - 2024. All rights reserved.