ぷろぐら×でざいん

Djangoカスタムコマンドを作成し、引数を送る

Djangoカスタムコマンドを作成し、引数を送る

Djangoカスタムコマンドを作成し、引数を送る

やりたいこと

DjangoCommandで引数を送り、内部処理の分岐に利用したい。
用途としては同じような処理だが、Modelが違うなどの場合はCommandに引数を渡し、その引数を元に処理の該当するModelを特定するなどができます。
また、業務的なコマンドなどを作る場合は日付やIDのリストを送るなどもできたりします。
まぁー要するに何でもやりたいことをやれるはずです。


ソースコード

import argparse

from django.core.management.base import BaseCommand


class Command(BaseCommand):
    help = """
    test_command
    ex: python manage.py test_command -t 1
    """
    # 引数を追加
    def add_arguments(self, parser):
        parser.add_argument('-t', action='store', dest='product_type', help='choices are 1,2,3,4',
                            required=True, type=valid_type)
    # 処理が走る場所
    def handle(self, *args, **options):
        try:
            print('Success with {}'.format(options['product_type']))
        except Exception as e:
            print(e)

# 引数のバリデーション
def valid_type(t):
    """
    :param unicode t:
    :rtype: int
    """
    try:
        product_type = int(t)
        if product_type in [1, 2, 3, 4]:
            return product_type
        raise argparse.ArgumentTypeError('Choices are 1, 2, 3, 4 but {0} are given'.format(product_type))
    except ValueError:
        raise argparse.ArgumentTypeError('Not a valid type: {}.'.format(t))


実行する

$ python manage.py test_command -t 1
Success with 1

$ python manage.py test_command -t 10
manage.py test_command: error: argument -t: Choices are 1, 2, 3, 4 but 10 are given

$ python manage.py test_command
manage.py test_command: error: the following arguments are required: -t

$ python manage.py test_command -t abc
manage.py test_command: error: argument -t: Not a valid type: abc.

あとがき

結構以前に書いたソースコードとかは覚えていないことがあるので、このような形で備忘録の意味も込めて定期的に書いて思い出して行きたいですね。便利コマンドは確かに便利なのですが、あまり使わないものなんかはどんどん削って行かないと、あとであれこれ何だっけってことが多発しますので作り過ぎも保守が面倒になるので気を付けたいポイントですね。


参照

Writing custom django-admin commands

コメントを残す

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