如何在 Django 之外使用 Django 模型?

Rei*_*ica 5 python django django-models python-3.x

按照指南,我可以通过调用python main.py.

??? data
?   ??? __init__.py
?   ??? migrations
?   ?   ??? __init__.py
?   ??? models.py
??? main.py
??? manage.py
??? settings.py
Run Code Online (Sandbox Code Playgroud)

其中 main.py 看起来像这样:

import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

django.setup()
from data.models import Foo, Bar #...

print(Foo.objects.all()) #this works fine
Run Code Online (Sandbox Code Playgroud)

我想要做的是把它变成一个叫做“包” db,看起来像这样:

    ??? data
    ?   ??? __init__.py
    ?   ??? migrations
    ?   ?   ??? __init__.py
    ?   ??? models.py
    ??? __init__.py 
    ??? manage.py
    ??? settings.py
Run Code Online (Sandbox Code Playgroud)

而在__init__.py中的db包,我想这样做:

import os, django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

django.setup()
from data.models import Foo, Bar # ...
from django.db import connection

__all__ = [
    'connection',
    'Foo',
    'Bar', 
    #...
]
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样dbtest.py(与 位于同一目录中db)调用包:

import db

print(db.Foo.objects.all()) #this throws an error "no module named data"
Run Code Online (Sandbox Code Playgroud)

或者像这样:

from db import Foo

print(Foo.objects.all()) # this throws an error "no module named settings"
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以使用 Django 的模型而无需调用: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings') django.setup()

在每个使用模型的页面上?

我在这里缺少什么?

Sco*_*les 2

如果您检查Django 应用程序的加载方式,我认为您需要在 application\xe2\x80\x99s 中运行设置models.py,而models/init.py不是在db/__init__.py

\n\n
\n

当 Django 启动时,django.setup() 负责填充应用程序注册表。

\n\n

setup(set_prefix=True) 通过以下方式配置 Django:

\n\n

加载设置。设置日志记录。如果 set_prefix 为 True,则将 URL 解析器脚本前缀设置为 FORCE_SCRIPT_NAME(如果已定义),否则设置为 /。初始化应用程序注册表。这个\n函数会被自动调用:

\n\n

通过 Django\xe2\x80\x99s WSGI 支持运行 HTTP 服务器时。当调用管理命令时。\n 在其他情况下必须显式调用它,例如在纯 Python 脚本中。

\n\n

应用程序注册表分三个阶段初始化。在每个阶段,Django 按照 INSTALLED_APPS 的顺序处理所有应用程序。

\n\n

首先 Django 导入 INSTALLED_APPS 中的每个项目。

\n\n

如果它\xe2\x80\x99是应用程序配置类,Django将导入应用程序的根\n包,由其名称属性定义。如果它\xe2\x80\x99是一个Python包,Django会创建一个默认的应用程序配置。

\n\n

在此阶段,您的代码不应\xe2\x80\x99 导入任何模型!

\n\n

换句话说,您的应用程序\xe2\x80\x99 根包和定义应用程序配置类的模块\xe2\x80\x99 不应导入任何\n 模型,即使是间接导入。

\n\n

严格来说,一旦加载应用程序配置,Django 就允许导入模型。但是,为了避免对 INSTALLED_APPS 的顺序产生不必要的限制,强烈建议在此阶段不要导入任何模型。

\n\n

此阶段完成后,对应用程序配置进行操作的 API(例如 get_app_config())就变得可用。

\n\n

然后 Django 尝试导入每个应用程序的模型子模块(如果有)。

\n\n

您必须在 application\xe2\x80\x99s models.py\n 或 models/__init__.py 中定义或导入所有模型。否则,此时应用程序注册表可能未完全填充,这可能会导致 ORM 出现故障。

\n\n

此阶段完成后,对模型进行操作的 API(例如 get_model())就可以使用。

\n\n

最后,Django 运行每个应用程序配置的ready() 方法。

\n
\n