Djangoのプロジェクトに管理コマンドを追加する

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の作成

管理コマンドを追加するには、 /management/commands/.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