2017-08-09 54 views
1

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

回答

1

下面是一個更新版本,修復了包括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')) 

希望有人會覺得很有用。