2013-02-24 7 views
43

私はsetup_environ()を使って、カスタムmanage.pyコマンド(私の好みの選択)として全くうまく収まらなかったコマンドラインから実行される、一度限りのpythonスクリプトを書きました。それはうまくすべてをセットアップします。私はこの機能を非難したと思います。非django pythonistasはこれのような魔法のようなもののためにdjangonautsを楽しませるので、私たちは汚い気分に疲れました。だから、それが非難された場合、代替手段は何ですか?たぶんこれは怠惰な質問ですが、setup_environの代わりに同じ効果を達成するには何が必要ですか?私は私のスクリプトに関数をコピー/ペーストすることができたと思いますが、私はそれを非難するという点ではないと仮定しています。 (明らかに私はまだ廃止予定の関数を使うことができますが、私のスクリプトはいくつかのバージョンのdjangoで生き残ることができます)一時的なdjangoスクリプトのために非推奨のsetup_environ()の代わりに?

答えて

55

これはちょうど私の2セントを追加Django 1.7

import os 
import django 
from myapp import models 

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

print models.MyModel.objects.get(pk=1) 
+1

1.7.3でdjango.setup()が動作しない AttributeError: 'module'オブジェクトに 'setup'属性がありません – Harry

+0

正しくインポートしていることを確認してください(パスが正しいことを確認してください) 。 1.7.3にsetup関数があります。https://github.com/django/django/blob/1.7.3/django/__init__.py –

+1

django.setup()は1.8 djangoバージョンで追加されました。それは1.7で動作しません。 https://docs.djangoproject.com/en/1.8/topics/settings/ – javed

21

Django 1.4リリースノートdjango.conf.settings.configure()を使用して設定をお勧めします。これは、あなたが "ピジョンソニック(Pythonic)"のやり方ですべてを行う必要がある小さなスクリプトにとってはいいです。しかし、より大きなプロジェクトを持っているなら、別の設定モジュール/パッケージを持っているDjangoのアプローチを使い、そのパスを環境変数DJANGO_SETTINGS_MODULEに入れます。これはmanage.pyに使用されたアプローチである。

# manage.py 

# ... 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings") 
# ... 

リリースのドキュメントはhereを見つけることができます。

+2

'manage.py'は' os.environ.setdefault( "DJANGO_SETTINGS_MODULE"、 "myproject.settings") 'という行を持っていますが、まだシェルを起動しようとすると、元の質問と同じエラーです。 –

28

あなたは

from django.core.management import setup_environ 

import fooproject.settings as settings 
setup_environ(settings) 

を持っていた前にちょうど

import os 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings") 
from django.conf import settings 

と交換し、設定が設定として読み込まれます場合は、miki725の答えに展開します。

Django 1.7+については、Ben Davisのソリューションを参照してください。

+1

これはdjango 1.6で私にとってはうまくいきません - sys.pathにプロジェクトパス(アプリケーションではない)を追加しました。DJANGO_SETTINGS_MODULEに設定モデルを追加してからdjango.confから設定をインポートしましたが、私のデータベースモデル(shoppinglist.models import ShoppingListから)をインポートすると、 "No models named models"というエラーが表示されます。同じimport行は、manage.pyで起動されたシェル内で動作します。何か案は? – frankster

+0

モデルをインポートできない場合は、パス値が正しく設定されていないように見えますが、設定に関するこの質問の範囲外です。パスをデバッグするには、 "manage.py shell"で起動したdjangoシェルではなく、 "python"で起動した通常のpythonシェルでテストしてみるべきです。 –

1

Disclaimer: I'm using Django 1.8

に変更されました:私は、このページで提示ソリューションのいくつかを試してみたが、それらはすべてで働いていたdid't。私はちょうど私が以下に共有している解決策を思いついた。

プロジェクトのルートフォルダにいることを確認してください。 manage.pyと同じです。レアンドロNは(、レアンドロをありがとう!)、あなたは(django.setup追加する必要が言ったことに追加するには

#make sure basic imports are in place 
>>> import os,django 

#set the specific django settings file 
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings.base") 

# import your modules and use them just like you do in your 
# web apps 
>>> from apps.customers import models as c 

# normal usage... for instance: 
>>> dir(c) 
['You', 'Will', 'See', 'Your', 'Models', ... ] 
+0

私がルートにいない場合はどうすればよいですか? – Alexis

2

)。例えば

、私のコード:FYI

import os, django 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') 
django.setup() 
from app.models import ModelA, ModelB 

、私は、Djangoの1.10上です。

関連する問題