Django: カスタムコマンドの作成

Django 4 の実践(アプリ開発編)

日付:2025年2月19日

Django で独自のカスタム管理コマンドを作成し、定期的な処理やバッチ処理を実行する方法を解説します。

目 次

はじめに

Django では、python manage.py で実行できる管理コマンドを カスタムコマンドとして作成 できます。

これにより、定期的なデータ処理、データベースのメンテナンス、ログの解析などのバッチ処理を手軽に実装 できます。

この記事で学べること

  • Django のカスタムコマンドの作成方法
  • コマンドの引数を受け取る方法
  • 実際のユースケースと活用例

1. カスタムコマンドとは?

Django には manage.py を使った多くのコマンド (runserver, migrate, createsuperuser など) が用意されていますが、
独自のコマンドを追加することで、特定のタスクを簡単に実行 できます。

📌 カスタムコマンドの活用例

  • データベースのバックアップを定期的に取得
  • 一括データ処理(例: 古いデータの削除)
  • 外部 API とのデータ同期

2. カスタムコマンドの作成手順

(1) コマンド用ディレクトリの作成

まず、Django アプリ (base/) の management/commands/ フォルダを作成します。

BASH
mkdir -p base/management/commands

次に、__init__.py を作成して、Python パッケージとして認識させます。

BASH
touch base/management/__init__.py touch base/management/commands/__init__.py

(2) コマンドファイルの作成

base/management/commands/sample_command.py を作成します。

PYTHON
from django.core.management.base import BaseCommand class Command(BaseCommand): help = 'サンプルのカスタムコマンド' def handle(self, *args, **kwargs): self.stdout.write(self.style.SUCCESS('カスタムコマンドが実行されました!'))

コードの解説:

  • BaseCommand を継承してカスタムコマンドを作成
  • help でコマンドの説明を定義
  • handle() メソッド内に実行する処理を記述

(3) コマンドの実行

作成したコマンドを以下のように実行できます。

BASH
python manage.py sample_command

出力例:

カスタムコマンドが実行されました!

3. コマンドに引数を追加

コマンドに引数を渡せるように拡張できます。

(1) 引数を受け取るコマンドの作成

base/management/commands/greet.py を作成し、引数を受け取るようにします。

PYTHON
from django.core.management.base import BaseCommand class Command(BaseCommand): help = '指定した名前で挨拶するコマンド' def add_arguments(self, parser): parser.add_argument('name', type=str, help='挨拶する名前') def handle(self, *args, **kwargs): name = kwargs['name'] self.stdout.write(self.style.SUCCESS(f'こんにちは、{name} さん!'))

(2) コマンドの実行

以下のように引数を渡して実行できます。

BASH
python manage.py greet 太郎

出力例:

こんにちは、太郎 さん!

📌 ポイント:

  • add_arguments() を使って引数を追加
  • handle()kwargs['name'] を取得

4. よくあるユースケース

(1) 定期的なデータクリーンアップ

古いデータを削除するカスタムコマンドを作成できます。

PYTHON
from django.core.management.base import BaseCommand from base.models import User from datetime import timedelta from django.utils.timezone import now class Command(BaseCommand): help = '90日以上ログインのないユーザーを削除' def handle(self, *args, **kwargs): threshold_date = now() - timedelta(days=90) deleted_count, _ = User.objects.filter(last_login__lt=threshold_date).delete() self.stdout.write(self.style.SUCCESS(f'{deleted_count} 件のユーザーを削除しました。'))

実行方法:

BASH
python manage.py cleanup_users

出力例:

50 件のユーザーを削除しました。

5. まとめ

  • Django のカスタムコマンドを作成すると、特定のタスクを簡単に実行できる
  • management/commands/ フォルダ内に Python ファイルを作成
  • BaseCommand を継承し、handle() メソッド内に処理を記述
  • add_arguments() を使うと、引数を受け取ることが可能