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()方法 配置