Edited at

Djangoでカスタムコマンドを実装してみよう


きっかけ

コマンド一つでExcelのデータをDBに移してくれたら、docker-compose.ymlとかに処理が書けて楽だよね。


環境


  • macOS 10.14.5

  • Django 2.2とかそこらへん


実装


1. サブコマンドとなるファイルを作る

以下のような構造でディレクトリとhoge_command.pyを配置

.

├── app
│ ├── __init__.py
│ ├── apps.py
│ ├── management
│ │ └── commands
│ │ └── hoge_command.py
│ ├── models.py
│ └── views.py

そのほかのファイル


2. hoge_command.pyにコマンドの機能を記述

BaseCommand を継承し、以下の関数をオーバーライドすることで実装できる。


hoge_command.py


from django.core.management import BaseCommand

class Command(BaseCommand):
help = 'コマンドの説明'

# コマンドのオプションを実装。必要なければ実装しなくていい。
def add_arguments(self, parser):
parser.add_argument('opt1', help='必須オプション')
parser.add_argument('--opt2', help='任意オプション')

# コマンドのメイン関数。オプションは options で取得できる。
def handle(self, *args, **options):
# この中に好きな処理を書こう!
self.stdout.write(self.style.SUCCESS('コマンド'))
self.stdout.write(options.__str__())



3. コマンドを実行してみる

$ python manage.py hoge_command

usage: manage.py hoge_command [-h] [--opt2 OPT2] [--version] [-v {0,1,2,3}]
[--settings SETTINGS]
[--pythonpath PYTHONPATH] [--traceback]
[--no-color] [--force-color]
opt1
manage.py hoge_command: error: the following arguments are required: opt1

正常(?)にオプション opt1 が必要とエラーが出ますね。

では、opt1 をしっかり渡してあげましょう。

$ python manage.py hoge_command abc

コマンド
{'verbosity': 1, 'settings': None, 'pythonpath': None, 'traceback': False, 'no_color': False, 'force_color': False, 'opt1': 'abc', 'opt2': None}

いい感じですね。


4. ヘルプを表示してみる

$ python manage.py hoge_command -h

で、コマンドの説明とhelpの一覧を見れます。長いので結果は割愛。


終わりに

以上、カスタムコマンドの実装でした。

それでは、良いDjangoライフを!


参考サイト

Django カスタムコマンドを実装する

カスタム django-admin コマンドの実装