Djangoで自作コマンドをmanage.py mycommandで実行する方法

Djangoでバッチファイルの実行をする方法です。

だいぶ前に「PythonでDjangoを使ったバッチ処理」で説明していますが、別のやり方です。というか、Djangoとしてはこっちが正しいんだと思います。

まずは任意のプロジェクトがあって、プロジェクトにappというアプリケーションが作成されているものとして進めます。

そこで、app(アプリケーションフォルダ)の下に「management」というフォルダを作成、中に__init__.pyを配置します。__init__.pyは空でいいです。

次に、managementフォルダの中に「commands」というフォルダを作成、またもやcommandsフォルダのなかに__init__.pyを配置します。もちろん、空で大丈夫です。

そして、commandsフォルダの中に「mycommand.py」を配置します。これが今回のメインになります。ここまでで以下の構成になっていると思います。

プロジェクトルート/
| app/
| | management/
| | | commands/
| | | | __init__.py
| | | | mycommand.py
| | | __init__.py
| | __init__.py
| | models.py
| | tests.py
| | views.py
| __init__.py
| manage.py
| settings.py
| urls.py

これでやっとバッチ処理が書けます。mycommand.pyを開いて、

#! /usr/local/bin/python
# -*- coding: utf-8 -*-

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def handle(self, *args, **options):
        print "hello command."

これでOK!

python manage.py mycommand

で実行できます。もちろんDjangoのmodelとかも触れます。*argsがあるから引数もOK!
こっちのほうがきれいにまとまりますね。

Python2.7、Django1.3.1で動作しています。試してませんが、もっと古いDjangoでも動くのではないかと。