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)
所以我可以像这样db
从test.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()
在每个使用模型的页面上?
我在这里缺少什么?
如果您检查Django 应用程序的加载方式,我认为您需要在 application\xe2\x80\x99s 中运行设置models.py
,而models/init.py
不是在db/__init__.py
\n\n当 Django 启动时,django.setup() 负责填充应用程序注册表。
\n\nsetup(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
归档时间: |
|
查看次数: |
1829 次 |
最近记录: |