Python 如何在Django之外使用Django模型?
根据指南,通过调用Python 如何在Django之外使用Django模型?,python,django,python-3.x,django-models,Python,Django,Python 3.x,Django Models,根据指南,通过调用python main.py,我能够使用Django之外的模型和以下文件结构 ├── data │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ └── models.py ├── main.py ├── manage.py └── settings.py 其中main.py如下所示: import os, django os.environ.setdefault('DJANGO_SETTIN
python main.py
,我能够使用Django之外的模型和以下文件结构
├── 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
├── data
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ └── models.py
├── __init__.py
├── manage.py
└── settings.py
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"
我想做的是把它变成一个名为db
的“包”,它看起来像这样:
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
├── data
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ └── models.py
├── __init__.py
├── manage.py
└── settings.py
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"
在db
包的\uuuuu init\uuuuu.py
中,我想这样做:
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',
#...
]
因此,我可以从test.py
(与db
位于同一目录中)调用db
包,如下所示:
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
├── data
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ └── models.py
├── __init__.py
├── manage.py
└── settings.py
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"
或者像这样:
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
├── data
│ ├── __init__.py
│ ├── migrations
│ │ └── __init__.py
│ └── models.py
├── __init__.py
├── manage.py
└── settings.py
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\u SETTINGS\u MODULE','SETTINGS')
django.setup()
在每个使用模型的页面上
这里我遗漏了什么?如果您查看我认为您需要如何在应用程序的models.py
或models/init.py
中运行安装程序,而不是在db/\uuu init\uuuuuuuuuuuupy
当Django启动时,Django.setup()负责填充
应用程序注册表。
安装程序(set_prefix=True)通过以下方式配置Django:
加载设置。设置日志记录。如果set_prefix为True,
如果需要,将URL解析器脚本前缀设置为强制脚本名称
定义,或/或其他。正在初始化应用程序注册表。这
函数将自动调用:
通过Django的WSGI支持运行HTTP服务器时。调用
管理指挥部。例如,在其他情况下必须显式调用它
纯Python脚本中的实例
应用程序注册表分三个阶段初始化。每次
阶段,Django按以下顺序处理所有应用程序
已安装的应用程序
首先Django导入已安装的应用程序中的每个项目
如果是应用程序配置类,Django将导入根目录
应用程序的包,由其名称属性定义。如果它是一个
Python包,Django创建一个默认的应用程序配置
在此阶段,您的代码不应导入任何模型强>
换句话说,应用程序的根包和
定义应用程序配置类不应导入任何
模型,甚至是间接的
严格来说,Django允许在模型发布后导入模型
已加载应用程序配置。但是,为了避免
对已安装的应用程序的顺序不必要的限制,它是
建议在此阶段不要导入任何模型
此阶段完成后,将显示在应用程序上运行的API
诸如get_app_config()之类的配置将变得可用
然后Django尝试导入每个模块的模型子模块
应用程序(如果有)
必须在应用程序的models.py中定义或导入所有模型
或models/\uuuu init\uuuu.py。否则,应用程序注册表可能不可用
此时已完全填充,这可能会导致ORM
故障。
一旦这个阶段完成,在诸如
get_model()变得可用
最后,Django运行每个应用程序的ready()方法
配置