在Django之外使用Django ORM

问题描述:

我是Django的新手,想要在脚本中使用它的ORM,而不需要运行整个Django。我正在摸索如何配置它。搜索StackOverflow没有帮助,因为答案没有显示完整的图片。在Django之外使用Django ORM

因此,我创建了一个小项目:

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 

,最后我的主文件的应用程序。 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.

我在做什么错?

+1

django拥有管理命令,您可以在不运行runserver的情况下以脚本运行。在这里阅读更多信息:https://docs.djangoproject.com/en/1.11/howto/custom-management-commands/ –

+0

使用自定义命令@VikashSingh已经提到。另一种方法是https://stackoverflow.com/a/41826771/5616580 – mateuszb

+1

您正在配置'manage.py'中的设置,但您正在运行'app.py'。如果你要运行'app.py'这是你需要配置它们的地方。在使用ORM之前,您还需要调用'django.setup()'。 – knbk

下面是一个更新版本,修复了包括django.setup()线和一些额外的设置,包括:

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

希望有人会觉得很有用。