Djangoのカスタムコマンドを使ってプログラムが作成してあります。これをターミナルから実行するときに「python manage.py sample_program 2024-02-14」のように日付を入れて実行するようにして、さらに2024-01-01から2024-01-31の一ヶ月分を実行するプログラムに改良してみます。
コマンドラインから日付を取得できるようにする
Commandクラスに「add_arguments」メソッドを追加し、「handle」メソッドで引数を使用するように設定します。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import json from django.core.management.base import BaseCommand from AppName.models import ModelName from datetime import datetime class Command(BaseCommand): def add_arguments(self, parser): # ターゲット日付のためのコマンドライン引数を追加 parser.add_argument('target_date', type=str, help='Target date in YYYY-MM-DD format') def handle(self, *args, **kwargs): # コマンドラインからターゲット日付を取得 target_date_str = kwargs['target_date'] target_date = datetime.strptime(target_date_str, '%Y-%m-%d').date() |
コマンドラインから実行
0 1 2 |
$ python manage.py sample_program 2024-02-14 |
指定期間内の日付分を実行
期間を指定してコマンドを実行するには、Pythonスクリプト内で日付範囲を生成して、それぞれの日付に対し、コマンドを実行するループを作成します。
Djangoの「call_command」関数を使ってコマンドをプログラム的に呼び出します。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from datetime import datetime, timedelta from django.core.management import call_command # 開始日と終了日を設定 start_date = datetime(2024, 1, 1) end_date = datetime(2024, 1, 31) # 現在の日付を開始日に設定 current_date = start_date while current_date <= end_date: # 現在の日付を文字列に変換 target_date_str = current_date.strftime('%Y-%m-%d') # コマンドを呼び出し、ターゲット日付を引数として渡す call_command('sample_program', target_date_str) # 現在の日付を1日進める current_date += timedelta(days=1) |
call_command関数はコマンド名と引数を受け取ります。