django について
django は、Django プロジェクト向けの開発スキルで、Celery タスクの構成やアプリ間シグナルなどの規約をまとめています。コンポーネント別の資料と検証項目も案内します。
主な機能
- 01サービス関数を中心とした Celery タスク構成
- 02エントリーポイントからのタスク登録
- 03カスタムシグナルによるアプリ間連携
- 04Django コンポーネント別資料の参照
- 05マイグレーションと管理画面の確認
活用シーン
- 01Django の非同期タスクコードの構成
- 02Django アプリ間イベントの連携
- 03マイグレーションと管理画面の変更確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ imankulov/ skills --skill djangoインストール後、Claude Code で/djangoを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/admin.mdmigrations.mdmodels.mdservice-provider.mdviews.md詳細
Django 開発パターン
Django プロジェクトで推奨する規約です。アプリのアーキテクチャとモジュールの構成については、python スキルを参照してください。これらのパターンはすべての Python プロジェクトに適用できます。
Celery タスクのパターン
タスク関数の末尾には _task を付け、サフィックスのないサービス関数を呼び出します。
これにより、インポートをすっきり保てます。エイリアスを付けずに from myapp.services import execute_report と記述できます。
from myapp.services import execute_report, fail_report
@celery_app.task(bind=True)
def execute_report_task(self, report_id: int) -> None:
"""Execute report generation asynchronously."""
try:
execute_report(report_id)
except Exception as exc:
if self.request.retries >= self.max_retries:
fail_report(report_id=report_id, error_message=str(exc))
raise
タスクのスケジュール設定は、サービス関数からではなく、エントリーポイント(api.py、admin.py)で行います。これにより、循環インポートを防ぎ、呼び出し元でタスクのスケジュール設定が明確になります。すべてのエントリーポイントで再利用できるよう、ビジネスロジックはサービス関数に置きます。タスクはサービスを呼び出すだけにします。
スケジュール用ヘルパー
複数のエントリーポイントで、保留中のレコードを作成してタスクをスケジュールする必要がある場合は、tasks.py に schedule_* 関数を切り出します。これは「tasks.py にロジックを置かない」というルールの唯一の例外です。この関数の責務は、レコードの作成とタスクのスケジュール設定を組み合わせることだけです。
# tasks.py
def schedule_refresh_all(user: User) -> RefreshOperation:
"""Create the pending record and schedule the task."""
operation = create_pending_refresh_operation(user)
refresh_all_task.delay(operation.id)
return operation
エントリーポイントでは、create-then-delay のパターンを重複して実装する代わりに、schedule_refresh_all() を呼び出します。
アプリ間のシグナル
あるアプリが別のアプリのイベントに反応する必要がある場合は、直接インポートしたり、モデルシグナル(post_save など)を使ったりせず、カスタム Django シグナルを使います。
- シグナルを送信するアプリの
signals.pyでシグナルを定義します。 Model.save()ではなく、サービス関数からシグナルを送信します。これにより、シグナルを送信するタイミングと、シグナルが持つデータを制御できます。- 受信側アプリの
signals.pyでレシーバーを定義し、AppConfig.ready()を通じて登録します。
# emitting app: accounts/signals.py
from django.dispatch import Signal
websites_updated = Signal()
# emitting app: accounts/services.py
websites_updated.send(sender=refresh_all, user=user, added=added)
# listening app: filtering/signals.py
from django.dispatch import receiver
from accounts.signals import websites_updated
@receiver(websites_updated)
def on_websites_updated(sender, user, added, **kwargs):
...
# listening app: filtering/apps.py
class FilteringConfig(AppConfig):
def ready(self) -> None:
import_module("filtering.signals")
依存関係は一方向に保ちます。受信側アプリは送信側アプリをインポートしますが、その逆は行いません。
コンポーネント別リファレンス
特定の Django コンポーネントに関する詳しいパターンは、必要に応じて以下のリファレンスを読み込んでください。
- モデルの規約 — 基底クラス、EnumField、SchemaField、Meta
- マイグレーション — スキーマとデータのマイグレーション順序、履歴モデル、可逆性、マイグレーションのテスト
- ビュー — Django のビュー関数、URL 設定
- 管理画面 — list_display、search、filters、@admin.display
- サービスプロバイダーパターン — レジストリとファクトリーを使った外部サービスとの連携
検証
Django コードを書いた後は、リファレンスに記載されている、見落としやすいルールを確認してください。
- 管理画面のアクションでは、変更処理にサービス関数を呼び出す
-
admin.pyのテストは書かない — テストする価値のあるロジックは、まずservices.pyに移す - 永続化されたフィールドを置き換える場合は、既存の値を保持するデータマイグレーションを含める。データの損失がユーザーに見える場合は、マイグレーションのテストも追加する