如何在Django之外使用Django模型?
问题内容:
遵循本指南,我可以通过调用在Django外部使用具有以下文件结构的模型python main.py
。
├── data
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ └── models.py
├── main.py
├── manage.py
└── settings.py
其中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
我要做的是将其转换为一个名为“ package”的文件db
,如下所示:
├── data
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ └── models.py
├── __init__.py
├── manage.py
└── settings.py
而在__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',
#...
]
因此,我可以这样调用db
包test.py
(位于db
):
import db
print(db.Foo.objects.all()) #this throws an error "no module named data"
或像这样:
from db import Foo
print(Foo.objects.all()) # this throws an error "no module named settings"
有没有一种方法可以使用Django的模型而无需调用: os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
django.setup()
在使用模型的每个页面上?
我在这里想念什么?
问题答案:
如果你看看如何Django的应用程序被加载,我认为你需要运行安装在你的应用程序models.py
或models/init.py
与不db/__init__.py
Django启动时,django.setup()负责填充应用程序注册表。
setup(set_prefix = True)通过以下方式配置Django:
正在加载设置。设置日志记录。如果set_prefix为True,则将URL解析器脚本前缀设置为FORCE_SCRIPT_NAME(如果已定义),否则设置为/。初始化应用程序注册表。该函数自动被调用:
通过Django的WSGI支持运行HTTP服务器时。调用管理命令时。在其他情况下,例如在纯Python脚本中,必须显式调用它。
应用程序注册表分为三个阶段初始化。在每个阶段,Django都会按照INSTALLED_APPS的顺序处理所有应用程序。
首先,Django将每个项目导入INSTALLED_APPS中。
如果是应用程序配置类,则Django会导入应用程序的根包,该根包由其name属性定义。如果是Python软件包,则Django将创建默认的应用程序配置。
在此阶段,您的代码不应导入任何模型!
换句话说,应用程序的根包和定义应用程序配置类的模块不应导入任何模型,即使是间接导入的模型也不应。
严格来说,Django允许在应用程序配置加载后导入模型。
但是,为了避免不必要地限制INSTALLED_APPS的顺序,强烈建议您在此阶段不要导入任何模型。一旦完成此阶段,就可以使用对应用程序配置(例如get_app_config())进行操作的API。
然后,Django尝试导入每个应用程序的models子模块(如果有)。
您必须在应用程序的models.py或models / init.py中定义或导入所有模型。
否则,此时应用程序注册表可能尚未完全填充,这可能导致ORM出现故障。一旦完成此阶段,就可以使用在诸如get_model()之类的模型上运行的API。
最后,Django运行每个应用程序配置的ready()方法。