[Django] カスタムコマンドを日付順に実行

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関数はコマンド名と引数を受け取ります。



Author: webmaster