2011-11-08 16 views
46

私はdjangoアプリケーションが使用するデータベースにいくつかのモデルオブジェクトをインポートするためのスクリプトを作成しています。過去に私は./manage.py shellを実行してからimport myscriptを実行してこれを解決しました。私は良い方法があると確信しています。 python scriptname.pyを使って私のHD上のどこからでもスクリプトを呼び出せるようにしたいと思います。そのスクリプトの最初の数行では、モデルオブジェクトにアクセスして動作しているかのように必要なインポート/その他の操作を行いますmanage.py shellを使用して実行します。manage.pyシェルを使用せずにモデルオブジェクトにアクセスするDjangoスクリプト

これを達成するには、スクリプトに何を追加する必要がありますか?

EDIT:Melugの答え@に基づいて

、動的に 'どこにでも私のHDの' 質問の一部に対処するためのPythonパスの設定を追加した:

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")をimport osの直後の行に移動した後で、これは私のために働いていました。さもなければ、これははるかに良い解決策です。 –

+0

良い点、ピーター!おそらく、いくつかのモデルのインポートは、 'os.environ.setdefault(...)'行の後で動作するかもしれません。私は私のポストで輸入品を並べ替えました。今は誰にとってもうまくいくはずです。 PS:このソリューションがさらに好きな人は、投票してください。ありがとう! – Michael

64

を取得するにはモデルもロードされましたが、これをthis answerと組み合わせなければならなかった、そうでなければ私はdjango.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

012余分として

、私はそれをコピー/ペーストが可能であるので、それは自動的にアプリの名前を発見するでしょう、私の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

ありがとう、 ()** 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 FOR

アッパーソリューションが動作しますが、私にエラー与えませんでした:

django.core.exceptions.AppRegistryNotReadyを:アプリがまだロードされていません。

は私にとってhereからの溶液を働いた:Djangoのバージョン1.9以降の場合

import os 
from django.core.wsgi import get_wsgi_application 

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

をあなたは、この使用することができます。

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 mが含まれていますインポート時に必要な設定を行うモジュール。

from myproject.wsgi import application 
0

あなたが取得する場合:あなたのsettings.pyは、あなたのスクリプトで、単なる輸入ですmyproject/myprojectと仮定するとある

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)

関連する問題