Djangoのmanage.pyは独自に管理コマンドを作成して追加できます。
ここでは、「myapp」という名前のDjangoアプリケーションに対し、「summation」という名前のコマンドを実装する例を紹介します。
myappはプロジェクトに作成済みで、INSTALLED_APPSに追加済みの前提です。
試したのは、Django 1.8.4、Python 3.4。
Django 1.8からの変更点
Django 1.7以前は、コマンドラインオプションのパーサーはoptparseでしたが、 Django 1.8 からargparseに変更されました。
オプションの追加方法は、BaseCommand.option_listを拡張するのではなく、add_argumentメソッドをオーバーライドする方法に変更されました。
ディレクトリと__init__.pyの作成
管理コマンドを追加するには、
まずはモジュールを配置するためのディレクトリを作ります。
管理コマンドを追加したいDjangoアプリケーションの中に management/commands ディレクトリを作成します。
$ mkdir -p myapp/management/commands
また、このディレクトリをPythonのパッケージとするため、__init__.pyも作成しておきます。
$ touch myapp/management/__init__.py $ touch myapp/management/commands/__init__.py
コマンドのモジュールを作成
引数で指定した数値の総和を表示する「summation」というコマンドを作ります。
myapp/management/commands/summation.pyを以下の内容で作成します。
from django.core.management.base import BaseCommand class Command(BaseCommand): help = "引数で指定した数値の総和を表示します" def add_arguments(self, parser): parser.add_argument('values', nargs='+', type=int) def handle(self, *args, **options): print(sum(options['values']))
最終的なディレクトリのレイアウトは次のようになります。
$ tree myapp myapp ├── __init__.py ├── admin.py ├── management │ ├── __init__.py │ └── commands │ ├── __init__.py │ └── summation.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py └── views.py
これで、manage.py helpを実行すると、次のようにsummationコマンドが増えています。
$ ./manage.py help # (中略) [myapp] summation # (中略)
summationコマンドを実行すると、数値の合計が表示されます。
$ ./manage.py summation 10 20 30 60