Djangoのカスタムコマンドを使ってプログラムが作成してあります。これをターミナルから実行するときに「python manage.py sample_program 2024-02-14」のように日付を入れて実行するようにして、さらに2024-01-01から2024-01-31の一ヶ月分を実行するプログラムに改良してみます。
コマンドラインから日付を取得できるようにする
Commandクラスに「add_arguments」メソッドを追加し、「handle」メソッドで引数を使用するように設定します。
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()
コマンドラインから実行
$ python manage.py sample_program 2024-02-14
指定期間内の日付分を実行
期間を指定してコマンドを実行するには、Pythonスクリプト内で日付範囲を生成して、それぞれの日付に対し、コマンドを実行するループを作成します。
Djangoの「call_command」関数を使ってコマンドをプログラム的に呼び出します。
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関数はコマンド名と引数を受け取ります。