LoginSignup
11
9

More than 5 years have passed since last update.

Django プロジェクトの外のバッチスクリプトから Django の機能を使う

Last updated at Posted at 2016-05-16

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 プロジェクト内の機能にアクセスすることができます。

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9