在 Django 之外使用 Django ORM

问题描述 投票:0回答:4

我是 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.

我做错了什么?

python django python-2.7 django-models orm
4个回答
21
投票

所以你的问题是:

我想在我的脚本中使用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)。


10
投票

您可以在这里找到所有信息

这适用于 Django 3.1 版本

import django
from django.conf import settings
from myapp import myapp_defaults

settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()

# Now this script or any imported module can use any part of Django it needs.
from myapp import models

7
投票

这是更新版本,修复包括

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'))

希望有人会发现它有用。


0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.