Django で、バッチ処理を行いたい時は、マネジメントコマンドを書きますよね。
でも、マネジメントコマンドを書くほどでもないバッチ処理がたまにあります。
書き捨てのデータマイグレーションスクリプトとか。
トラブル調査のためだけの集計ツールとか。
そんな時、マネジメントコマンドとして登録しなくても、Django プロジェクトの外に置いた Python ファイルから、Djangoの機能にアクセスできます。
このようなスクリプトを用意しておきます。
django_setup.py
"""
django_setup() を実行すると、Django の機能(モデルのインポートなど)が使えるようになる。
"""
import os
import sys
import django
def django_setup():
os.environ.setdefault(
'DJANGO_SETTINGS_MODULE', 'myapp.settings')
base_dir = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
sys.path.append(os.path.join(base_dir, 'myproject'))
django.setup()
要は、Django のプロジェクトルート ( ./manage.py のある所 ) を sys.path
に追加し、django.setup()
を実行すれば良いです。
独自の設定ファイルを使っている場合は、環境変数 DJANGO_SETTINGS_MODULE
に指定しておきましょう。
__file__
を os.path.dirname
で辿ったりしてますが、このへんはお使いの環境で適宜変更してください。
base_dir が、Django プロジェクト (myproject) の 「1つ上」のディレクトリの想定です。
こうすれば、書き捨てのスクリプトなどで
from django_setup import django_setup
def main():
from myapp.models import MyModel
for item in MyModel.objects.filter(...):
...
if __name__ == '__main__':
django_setup()
main()
このように、Django プロジェクト内の機能にアクセスすることができます。