カスタム django-admin コマンドに、独自引数を追加する

前回の記事「カスタム django-admin コマンドを実装して、外部からアプリ内のモデルを使う」の続きです。

背景

前回は、カスタムコマンドとして、「crawler」を追加し、$ python manage.py crawlerで、実行できるようにしました。
今回は、そのコマンドに引数を渡して、処理を切り替えられるようにします。

サンプルのコード

  • add_argumentsという関数を実装し、引数の扱い方を指定します。
from django.core.management.base import BaseCommand, CommandError
from app1.models import Topic

class Command(BaseCommand):
  help = 'crawler for test.'

  def add_arguments(self, parser):
    parser.add_argument('-c', '--check-alive', action='store_true', dest='check-alive', help='Check topic alive.')

  def handle(self, *args, **options):
    #self.myprint("options=%s" % options)
    if not options['check-alive']:
      self.crawl_new()
    else:
      self.check_alive()

  def crawl_new(self):
    self.myprint('this is function crawl_new.')

  def check_alive(self):
    self.myprint('this is function check_alive.')

要点

  • 引数は、--versionのように後続の引数が無いものと、--verbosity 3のように後続の引数が有るものの2種類に分けられます。

    • 後続の引数が無い場合は、action='store_true'を指定します。(これの詳しい解説記事が見つからなかった)。引数が指定されたか否かは、True/Falseで格納されます。
    • 後続の引数が有る場合は、nargs='*'を指定します。後続の引数は辞書型で格納されます。後続の引数が省略された場合は、空の辞書が格納されます。
  • さらに、dest='check-alive'で、引数がどのように指定されたかをoptionsにどんなキーで格納するかを指定します。

    • この指定が無いと、引数名の長い方の名前で、-_に変換したキーで格納されます。(上記の例ではoptions['check_alive'])。
    • 引数に長い名前の場合はハイフンを使う場合が多いので、destを指定した方が無難かと思います。

気になる点

  • 上記の場合、-cの代わりに-cc-ccccccccのように同じ文字を重ねて指定しても同じ結果になりますが、-c1のように異なる文字を指定するとerror: argument -c/--check-alive: ignored explicit argument '1'とエラーになります。長い引数の場合は--check-aliveeのように末尾の同じ文字を重ねるとエラーになります。

参考サイト

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です