【发布时间】:2011-01-11 22:22:04
【问题描述】:
我在 Django 中创建了一个不错的数据库,我想通过我的网站内容外部的一些 python 脚本进行交互,所以我很好奇这是否可能在 Django 站点之外使用 Django 数据库 API,如果是这样,是否有人知道如何做到这一点?谷歌并没有为此产生很多成功。
【问题讨论】:
我在 Django 中创建了一个不错的数据库,我想通过我的网站内容外部的一些 python 脚本进行交互,所以我很好奇这是否可能在 Django 站点之外使用 Django 数据库 API,如果是这样,是否有人知道如何做到这一点?谷歌并没有为此产生很多成功。
【问题讨论】:
对于 django 3+:
#########################
目录和文件结构:
--我的项目
----my_project > settings.py
----我的应用程序
##########################
import sys
sys.path.append("C:/Users/khder/Desktop/test/my_project") #append your main project directory path
import os
import django
#define your setting file as the following.
os.environ.setdefault(
'DJANGO_SETTINGS_MODULE', 'my_project.settings'
)
django.setup()
from my_app.models import MyModel
qs = MyModel.objects.all()
print(qs)
我希望这会有所帮助。 完成。
【讨论】:
在 Django >= V.3.2.3 在模型导入之前放置以下内容
import os
import django
os.environ.setdefault(
'DJANGO_SETTINGS_MODULE', 'mymodule.settings'
)
django.setup()
from app.models import MyModel
然后像往常一样使用你的模型。
myitem = MyModel()
myitem.data = 'some data'
myitem.save()
问候
【讨论】:
我一直在寻找 django 3.0 的答案,但上述方法都不适合我。
我在https://docs.djangoproject.com/en/3.0/topics/settings/ 阅读了官方文档,这个脚本对我有用。
我的脚本 db_tasks.py 像这样在 mysite 中。
mysite
mysite
db.sqlite3
db_tasks.py
manage.py
polls
db_tasks.py
import os
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'dashboard.settings'
django.setup()
from polls.models import Question
print(Question.objects.all())
out: <QuerySet [<Question: WTU?]>
【讨论】:
dashboard。您可以选择您的项目名称。
这是我使用的代码。只需将 your_project 替换为您的 Django 项目名称,将 yourApp 替换为您的 Django 应用程序名称,将 any_model 替换为您要在模型文件中使用的模型,将 any_fild 替换为您要从数据库中获取的字段:
from django.conf import settings
import django
from your_project.settings import DATABASES, INSTALLED_APPS
settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
django.setup()
from yourApp.models import *
print(any_model.objects.all()[0].any_fild)
【讨论】:
根据Hai Hu 的回答,这是一个工作脚本,在 Django 1.10 和 1.11 上进行了测试。 我首先导入 Django 的基础应用程序,因为许多其他应用程序都需要它们。
import os
from django.conf import settings
from django.apps import apps
conf = {
'INSTALLED_APPS': [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.messages',
'django.contrib.sessions',
'django.contrib.sitemaps',
'django.contrib.sites',
'django.contrib.staticfiles',
'<your_app>',
],
'DATABASES': {
'default': {
'ENGINE': os.environ.get('DB_ENGINE'),
'NAME': os.environ.get('DB_NAME'),
'USER': os.environ.get('DB_USER'),
'PASSWORD': os.environ.get('DB_PASSWORD'),
'HOST': os.environ.get('DB_HOST'),
'PORT': os.environ.get('DB_PORT'),
}
},
'TIME_ZONE': 'UTC'
}
settings.configure(**conf)
apps.populate(settings.INSTALLED_APPS)
<import your app models here>
【讨论】:
import os, sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
from app.models import MyModel
【讨论】:
最后一个没有人提到的选项:custom ./manage.py subcommand。
【讨论】:
对于 django 1.7,我使用以下内容启动并运行。
settings.py:
from django.conf import settings
settings.configure(
DATABASES={
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'name',
'USER': 'usr',
'PASSWORD': 'secret',
'HOST': '127.0.0.1',
'PORT': '5432',
},
},
TIME_ZONE='America/Montreal',
)
在包含启动例程的文件中
import os
import django
import v10consolidator.settings
from myapp.models import *
os.environ.setdefault(
"DJANGO_SETTINGS_MODULE",
"myapp.settings"
)
django.setup()
【讨论】:
对于 django 1.5 on(支持多个数据库),DATABASE 设置也发生了变化。 您需要将先前的答案调整为...
settings.configure(
DATABASES = { 'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'db_name',
'USER': 'db_usr',
'PASSWORD': 'db_pass',
'HOST': '',
'PORT': '',
}, },
TIME_ZONE = 'Europe/Luxembourg'
)
【讨论】:
更新 setup_environ 将在 django 1.6 中移除
如果你能够导入你的 settings.py 文件,那么take a look 就在方便的 setup_environ 命令中。
from django.core.management import setup_environ
from mysite import settings
setup_environ(settings)
#here you can do everything you could in your project
【讨论】:
从您需要的其他应用程序中使用 Django ORM:
1) export DJANGO_SETTINGS_MODULE=dproj.settings
2) 将你的 Django 应用文件夹添加到路径中(你可以在你的非 django-app 的代码中做到这一点):
sys.path = sys.path + ['/path/to/your/app/']
3) 如果使用 SQLite,请使用 settings.py 中 db 文件的完整路径:
DATABASE_NAME = '/path/to/your/app/base.db'
【讨论】:
您只需要在进行任何调用之前配置 Django 设置,包括导入模型。像这样的:
from django.conf import settings
settings.configure(
DATABASE_ENGINE = 'postgresql_psycopg2',
DATABASE_NAME = 'db_name',
DATABASE_USER = 'db_user',
DATABASE_PASSWORD = 'db_pass',
DATABASE_HOST = 'localhost',
DATABASE_PORT = '5432',
TIME_ZONE = 'America/New_York',
)
同样,请确保在运行之前运行该代码,例如:
from your_app.models import *
然后照常使用 DB API。
【讨论】:
settings.py 还不够吗?