django-extensionsには、スクリプトファイルを実行するための runscript というコマンドが用意されている。
このコマンドを使うと、Djangoのコンテキスト(つまり、Djangoのsettings.pyが適用された、 django.setup()
を実行済みの状態)で、Pythonのスクリプトを実行できる。
RunScript — django-extensions 3.2.3 documentation
試したバージョンは、Python 3.10、Django 4.2、django-extensions 3.2.3。
scriptsフォルダにスクリプトファイルを用意する
django-extensionsをセットアップ済みのプロジェクトで作業する。
Djangoのプロジェクトディレクトリに、 scripts
という名前のフォルダを作成し、スクリプトファイルはその中に作成する。
scriptsフォルダ内のスクリプトをPythonモジュールとして再利用しないのであれば、scriptsフォルダには __init__.py
を作成しなくてもよい。
今回作成したのは、 scripts/foo.py
というファイル。
ディレクトリ構造とファイルの配置は次の通り。
. ├── db.sqlite3 ├── manage.py ├── myproject │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── scripts └── foo.py
scripts/foo.py:
from django.contrib.auth.models import Permission def run(*args): """fooという名前のスクリプト """ print(f"args: {args}") # ORMも使える print(Permission.objects.count())
今回作成したファイルでは、Permissionモデルのレコード件数を取得して画面に出力している。
このコードは、DjangoのORMが使われる。
関数名は run
としておく。runscriptコマンドから渡される引数は、可変長引数で受け取れる。
runscriptコマンドでスクリプトを実行する
django-extensionsをセットアップ済みのプロジェクトでは、manage.pyコマンドのサブコマンドとして runscript
コマンドが使えるようになっている。
python manage.py runscript <script_name>
のように、スクリプトファイル名の .py
を除いた名前で実行できる。
$ python manage.py runscript foo --script-args hoge fuga args: ('hoge', 'fuga') 24
スクリプトには、 --script-args
オプションでコマンドから追加パラメータの文字列を渡すことができる。スペース区切りで複数の値を指定できる。
実行結果では、ORMが動作して、正常にcount()の結果が表示されていることがわかる。