以前の記事では Django-Celery-Beat: 予約作業を生成する方法 を通して、Django-Celery-Beatで予約作業を生成する 基本的な方法 を見てきました。

📌 タイトルをクリックして以前のポストも確認してみてください!

しかし、実際のプロジェクトでは単純に 予約された時間ごとに繰り返し実行するだけ では十分ではない場合が多いです。

  • 特定の時間にだけ実行するように制限する必要があることもありますし、
  • 実行周期を動的に変更する必要がある場合もあります。
  • 特定の条件で作業を無効化したり、
  • 特定の日付以降は自動的に予約を解除するように設定する必要がある場合もあります。

このような 複雑なロジックを扱うため に、今回の回では Django-Celery-BeatのPeriodicTaskモデルをより深く掘り下げ、さまざまなフィールドと設定方法を見ていきます! 🚀

Django Celery-Beat PeriodicTask illustration

1️⃣ update_or_createを活用したPeriodicTask設定

実際のサービスでは 一度作成した予約作業をそのままにしておくよりも、ユーザーの要求や環境の変化に応じて修正する場合が多いです。

したがって、 PeriodicTask.objects.create() を使用するよりも update_or_create() メソッドを使用する方がより便利です。

📌 update_or_create() を使うと、

  1. 既に存在する作業であれば更新
  2. 存在しなければ新しく作成

つまり、 同じ名前の予約作業がある場合は上書き が可能なので、不要な重複インスタンスを防ぐことができます。

2️⃣ PeriodicTask.intervalフィールドとIntervalScheduleモデル

Django-Celery-Beatの PeriodicTaskinterval フィールドを通じて 繰り返し実行の間隔を設定 できます。

この interval フィールドは IntervalSchedule モデルに接続 されているため、まず IntervalSchedule インスタンスを作成した後、PeriodicTask でそれを参照する必要があります。

つまり、予約作業を登録するには:

  1. まず IntervalSchedule インスタンスを作成
  2. その後、作成された IntervalSchedulePeriodicTask に接続

3️⃣ IntervalScheduleフィールドオプション

フィールド名 説明 値の例
every 繰り返し周期の数値 10, 30, 2
period 繰り返し周期の単位 IntervalSchedule.SECONDS, IntervalSchedule.MINUTES, IntervalSchedule.HOURS, IntervalSchedule.DAYS

4️⃣ update_or_createを利用したPeriodicTask設定例

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# IntervalScheduleを生成 (10分ごとに実行)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,
    period=IntervalSchedule.MINUTES
)

# PeriodicTaskを作成または更新
task, created = PeriodicTask.objects.update_or_create(
    name="send_reminder_email",
    defaults={
        "interval": schedule,
        "task": "myapp.tasks.send_reminder_email",
        "args": json.dumps([1]),
        "enabled": True,
    }
)

5️⃣ PeriodicTaskのその他のフィールド説明

フィールド名 説明
name 作業のユニークな名前 "send_report_task"
interval 実行間隔 (IntervalSchedule 参照) schedule
crontab 特定の時間に実行する場合 (CrontabSchedule 参照) None
clocked 特定の時間に一度だけ実行 (ClockedSchedule 参照) None
task 実行するCelery Task "myapp.tasks.send_report"
args 関数に渡す引数 (JSON形式) json.dumps([123, "email@example.com"])
kwargs 関数に渡すキーワード引数 (JSON形式) json.dumps({"priority": "high"})
enabled 実行可否 True or False
one_off 一度だけ実行して終了 True or False

📌 one_off=True に設定すると、作業が一度実行された後 無効化されるが削除はされません

📌 clocked フィールドを使用すると 正確な特定の時間に一度実行される作業 を予約できます。

🎯 結論: 予約作業を柔軟に管理するためには update_or_create を活用しよう!

📌 Django-Celery-Beatで予約作業を登録する際に update_or_create() を使うと既存の作業を簡単に修正できる

📌 PeriodicTask.interval フィールドは IntervalSchedule を参照するため、まず IntervalSchedule インスタンスを作成してから接続する必要があります。

📌 複雑な予約作業を管理する際には args, kwargs, enabled, one_off, clocked などのフィールドを活用すれば、より柔軟に設定できます。

🔥 次回予告

今回の記事では PeriodicTaskをより柔軟に生成し、修正する方法 を見てきました。

次の回では Crontabを使って特定の時間に実行する予約作業の設定と、Clockedを活用して特定の時間に一度だけ実行する予約作業について扱う予定です。

より深いCeleryの活用法を知りたい方は、次回もお楽しみに! 🚀

さらに、ブログ内でCelery関連の記事をもっと見たい方は、

下の '類似ポスト' リストや、右上の検索バーで "Celery" を検索してみてください! 😊