我是 Django 新手,希望在我的脚本中使用它的 ORM,而不需要运行整个 Django 东西。我正在摸不着头脑如何配置它。在 StackOverflow 上搜索没有帮助,因为答案没有显示完整的情况。
因此,我创建了一个小项目:
app.py
manage.py
orm/
__init__.py
models.py
manage.py 有配置:
from django.conf import settings
settings.configure(
DATABASE_ENGINE = 'mysql',
DATABASE_NAME = 'db',
DATABASE_USER = 'admin',
DATABASE_PASSWORD = '',
DATABASE_HOST = 'localhost',
INSTALLED_APPS = ('orm')
)
models.py:
from django.db import models
class Label(models.Model):
name = models.CharField(max_length=50) # required max_length
最后是我的主文件 app.py:
from django.conf import settings
from django.db import models
from orm.models import *
\# do database maniupaltions
虽然运行 app.py 之后我收到一个错误:
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
我做错了什么?
所以你的问题是:
我想在我的脚本中使用Django的ORM而不运行完整的Django应用程序,如何配置它?
我将分享我正在使用 Django 2.0.2 为我目前正在进行的项目所做的事情。
我建议你创建一个文件
SetupDjangoORM.py
:
import django
from django.conf import settings
settings.configure(
DATABASES={
'default': {
'ENGINE': '<your_engine>',
'NAME': '<database_name>',
'HOST': '<hostname_or_ip>',
'PORT': '<port>',
'USER': '<user>',
'PASSWORD': '<super_secret_password>',
}
},
INSTALLED_APPS=[
'<your_app>',
]
)
django.setup()
您可以在您的
settings.py
文件中找到此信息。
然后,您可以将其导入到任何需要的地方:
from . import SetupDjangoORM
现在您可以在脚本中使用 Django 模型 (ORM)。
这是更新版本,修复包括
django.setup()
行和一些附加设置,包括:
管理.py
import os
import sys
import django
from django.conf import settings
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
INSTALLED_APPS = [
'orm',
]
DATABASES = {
'default': {
'ENGINE' : 'django.db.backends.mysql',
'NAME' : 'playground',
'USER' : 'admin',
'PASSWORD' : 'pasw',
'HOST' : 'localhost',
}
}
settings.configure(
INSTALLED_APPS = INSTALLED_APPS,
DATABASES = DATABASES,
)
django.setup()
if __name__ == "__main__":
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
还有app.py:
import manage
from orm.models import Label
if __name__ == '__main__':
Label.objects.create(name='test')
print(Label.objects.get(name='test'))
希望有人会发现它有用。
dorm
来完成。
免责声明:我是软件包的维护者
安装后
pip install dorm-project
,您只需将settings.py
添加到项目根目录,至少包含INSTALLED_APPS
和DATABASES
值
# <proj-root>/settings.py
from pathlib import Path
BASE_DIR = Path(__file__).parent.resolve()
INSTALLED_APPS = []
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": BASE_DIR / "db.sqlite3",
}
}
确保在项目端点中调用
dorm.setup()
以确保 ORM 可供使用。
import dorm
if __name__ == "__main__":
dorm.setup()
这样,您就可以开始将模型添加到任何包内的
models.py
文件(在 django 中称为 apps
,不要忘记将包添加到 INSTALLED_APPS
文件中的 settings.py
) - 就像您所做的那样在“完整”的 django 项目中完成它。
# blog/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
body = models.TextField()
# <proj-root>/settings.py
INSTALLED_APPS = ["blog"]
所有 Django 管理命令,如
makemigrations
、migrate
、shell
、test
等都可以使用 dorm
cli 运行
dorm makemigartions
dorm migrate
大家都可以添加可以使用ORM的
unittests
,并使用Django Test Runner运行:
# blog/tests.py
from django.test import TestCase
from blog.models import Post
class TestPostModel(TestCase):
def test_creating_object(self):
post = Post()
post.title = "Fake title"
post.slug = "fake-title"
post.post = "fake body"
post.save()
dorm test
...
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK