2011-11-08 172 views
46

我在寫一個腳本來將一些模型對象導入到我的django應用程序使用的數據庫中。在過去,我通過運行./manage.py shell然後import myscript來解決這個問題。我確定有更好的方法。我希望能夠使用python scriptname.py從我的HD上的任何位置調用腳本,並且在該腳本的前幾行中,它將執行任何必需的導入/其他操作,以便它可以訪問模型對象並且表現得好像它是使用manage.py shell運行。Django腳本訪問模型對象,而無需使用manage.py shell

我需要添加到我的腳本來實現這個目標?

編輯:

基於@ Melug的答案,用另外的動態設置Python的路徑來解決問題的「上的任何地方我HD」的一部分:

import sys 
sys.path.append('c:\\my_projec_src_folder') 
from myproject import settings 
from django.core.management import setup_environ 
setup_environ(settings) 

回答

22

您需要設置django環境優先:

from your_project import settings 
from django.core.management import setup_environ 
setup_environ(settings) 

最後導入你的模型,一切就像django一樣。

+18

'setup_environ(settings)'從Django 1.4開始已棄用!以下我的帖子顯示了一個包含示例的替代方案 – Michael

27

我認爲最好的辦法是創建你的custom management command(s)。那麼你可以從任何地方撥打manage.py <yourcommand>

+4

從長遠來看,這是更好的選擇。 –

+0

我同意,這是要走的路。這並不比創建獨立腳本困難得多,而且更加健壯。 –

+1

儘管如此,但仍有時需要使用其他腳本中的django模型。 – Rebs

100

由於Django 1.4您應該避免使用setup_environ(settings)(由Melug發佈),因爲它已被棄用。改用下面,你將能夠訪問你的模型

import os 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") 

# your imports, e.g. Django models 
from your_project_name.models import Location 

# From now onwards start your script.. 

下面是訪問和修改模型的例子:

if __name__ == '__main__':  
    # e.g. add a new location 
    l = Location() 
    l.name = 'Berlin' 
    l.save() 

    # this is an example to access your model 
    locations = Location.objects.all() 
    print locations 

    # e.g. delete the location 
    berlin = Location.objects.filter(name='Berlin') 
    print berlin 
    berlin.delete() 

實例模型:

class Location(models.Model): 
    name = models.CharField(max_length=100) 
+1

這真的是它現在完成的工作,完美無瑕。 –

+3

只有在我將os.environ.setdefault(「DJANGO_SETTINGS_MODULE」,「your_project_name.settings」)移到導入操作系統之後的行之後,這才適用於我。否則,這是一個更好的解決方案。 –

+0

好點,彼得!也許某些模型導入只能在'os.environ.setdefault(...)'行後面工作。我在我的帖子中重新排列了導入,現在它應該適用於所有人。 PS:如果你更喜歡這個解決方案,請投票支持。謝謝! – Michael

64

要獲得模型加載太多,我不得不將這與this answer,否則我得到django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings") 
import django 
django.setup() 

作爲一個額外的,我補充這我的Django項目的__init__.py,它會自動發現應用程序名稱,使其複製/粘貼,能夠:

import os 


def setup(): 
    module = os.path.split(os.path.dirname(__file__))[-1] 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(module)) 
    import django 
    django.setup() 

然後,我可以這樣做:

from <app> import setup 
setup() 
+4

謝謝,顯然它需要調用setup ()自** Django 1.7 **。 – Phae7rae

+1

init中的setup()很好,很喜歡! – ulath

+0

現在應該是正確的答案。唯一適用於我的解決方案。 – theeastcoastwest

2

下面是Django的版本的答案> 1.4:

from django.core.management import settings 
from myproject.myproject import settings as project_settings 

if not settings.configured: 
    settings.configure(default_settings=project_settings) 
4

Django的1.11

上的解決方案沒有工作,但給了我一個錯誤:

django.core.exceptions.AppRegistryNotReady:應用程序尚未加載。從here

對我來說,解決方案制定:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' 
application = get_wsgi_application() 
13

Django的版本1.9或更高版本,你可以使用這個:

import sys 
import os 
import django 

sys.path.append('your_project_directory') 
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_project.settings' 
django.setup() 

from yourapp.models import your_model 

所以你可以使用對象爲同一個Django的對象:

from myapp.models. import Locations 
all_locations = Locations.object.all() 
first_location = Locations.object.get(id=1) 
print first_location.name() 
first_location.save() 
1

由於至少Django 1.11,您的主要應用程序包括一個wsgi米模塊,可以在導入時進行必要的設置。假設myproject/myproject是你的settings.py是,在你的腳本只是進口:

from myproject.wsgi import application 
0

如果你得到:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

嘗試:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings') 
application = get_wsgi_application() 
0

嘗試:

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

如果os.environ.setdefault不起作用。 (Windows 10,python3.6.4,django 2.0.3)