django-developer
非同期ビューやDjango Ninja、HTMXを活用し、最新のフルスタックWebアプリケーションを効率的に開発するSkill。
📜 元の英語説明(参考)
Expert Django developer specializing in Async Views, Django Ninja (FastAPI-like), and HTMX patterns for modern full-stack apps.
🇯🇵 日本人クリエイター向け解説
非同期ビューやDjango Ninja、HTMXを活用し、最新のフルスタックWebアプリケーションを効率的に開発するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Django Developer
目的
async ビュー、Django Ninja API、および最新のフルスタックパターンに特化した Django および Python ウェブ開発の専門知識を提供します。サーバー駆動型 UI に HTMX、リアルタイム機能に Django Channels、バックグラウンドタスクに Celery を使用して、堅牢な Python ウェブアプリケーションを構築します。
使用する場面
- スケーラブルな REST API の構築(Django REST Framework または Django Ninja)
- リアルタイム機能の実装(Django Channels を介した WebSockets)
- HTMX を使用したフルスタックアプリの開発(サーバー駆動型 UI)
- バックグラウンドタスクの処理(Celery/Redis)
- データベースパフォーマンスの最適化(ORM Select/Prefetch、インデックス)
- ヘビーデューティーなデータモデルの設計(Postgres JSONB、制約)
2. 意思決定フレームワーク
アーキテクチャの選択
プロジェクトの目標は何ですか?
│
├─ **API ファースト (ヘッドレス)**
│ ├─ 型安全 / モダン? → **Django Ninja** (Pydantic ベース、高速)
│ └─ レガシー / エンタープライズ? → **DRF** (必要なものがすべて揃っている、重厚)
│
├─ **フルスタック (モノリス)**
│ ├─ 複雑な UI (SPA)? → **Django + React/Vue** (API 分離)
│ └─ 動的だがシンプル? → **Django + HTMX** (ハイパーメディア駆動、ビルドステップなし)
│
└─ **リアルタイム**
├─ シンプルな更新? → **HTMX ポーリング** または **SSE**
└─ 複雑/双方向? → **Django Channels (WebSockets)**
非同期戦略 (Django 4.2+)
| 機能 | 同期 (WSGI) | 非同期 (ASGI) | 推奨事項 |
|---|---|---|---|
| DB クエリ | User.objects.get() |
await User.objects.aget() |
高並行 I/O (プロキシ、チャット) には非同期を使用します。 |
| ビュー | def view(req): |
async def view(req): |
CPU バウンドなタスクには同期を維持します。 |
| ミドルウェア | 標準 | 非同期互換 | ミドルウェアスタックが非同期をサポートしていることを確認します。 |
データベースの最適化
- N+1 問題: 常に
select_related(外部キー) とprefetch_related(M2M) を確認してください。 - インデックス作成: JSONB 検索には
GinIndex、標準的なルックアップにはBTreeを使用してください。 - 一括操作: 100 件を超えるバッチには
bulk_createとbulk_updateを使用してください。
危険信号 → database-optimizer にエスカレート:
forループ内で実行される ORM クエリ- 10,000 行以上のデータをメモリにロードする(
.iterator()を使用) - パラメータバインディングなしの「Raw SQL」の使用(SQL インジェクションのリスク)
- トラフィックをブロックするロックの問題(Select for Update)
ワークフロー 2: HTMX 統合 (サーバー駆動型 UI)
目標: React を書かずに「無限スクロール」または「クリックして編集」を実装します。
手順:
-
ビュー (Python)
def contact_list(request): contacts = Contact.objects.all() # HTMX リクエストの場合、行のみを返す (部分) if request.htmx: template = "partials/contact_rows.html" else: template = "contact_list.html" return render(request, template, {"contacts": contacts}) -
テンプレート (
contact_list.html)<!-- 検索はキーアップ時にサーバーリクエストをトリガーします --> <input type="text" name="search" hx-get="/contacts" hx-trigger="keyup changed delay:500ms" hx-target="#contact-rows"> <table> <tbody id="contact-rows"> {% include "partials/contact_rows.html" %} </tbody> </table>
ワークフロー 4: 非同期 ORM & ビュー
目標: async/await を使用した高スループット API エンドポイント。
手順:
-
ビュー定義
# views.py from asgiref.sync import sync_to_async async def dashboard_stats(request): # 並列 DB クエリ user_count_task = User.objects.acount() order_count_task = Order.objects.acount() user_count, order_count = await asyncio.gather( user_count_task, order_count_task ) return JsonResponse({"users": user_count, "orders": order_count}) -
ミドルウェアの互換性
- すべてのミドルウェアが非同期対応 (
async_capable = True) であることを確認します。 - ブロッキングミドルウェアが存在する場合は、
sync_to_asyncでラップします。
- すべてのミドルウェアが非同期対応 (
4. パターン & テンプレート
パターン 1: サービスレイヤー (ビジネスロジック)
ユースケース: ビューとモデルをスリムに保つ。
# services.py
class OrderService:
@staticmethod
def create_order(user, items_data):
with transaction.atomic():
order = Order.objects.create(user=user)
for item in items_data:
OrderItem.objects.create(order=order, **item)
# ここに複雑なロジック
PaymentGateway.charge(order)
return order
パターン 2: カスタムマネージャー (クエリロジック)
ユースケース: 再利用可能なフィルター。
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='PUBLISHED', pub_date__lte=timezone.now())
class Article(models.Model):
# ...
objects = models.Manager() # デフォルト
published = PublishedManager() # カスタム
パターン 3: 非同期チャット (Channels)
ユースケース: WebSocket 処理。
# consumers.py
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = "lobby"
await self.channel_layer.group_add(self.room_name, self.channel_name)
await self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard(self.room_name, self.channel_name)
async def receive(self, text_data):
# グループにブロードキャスト
await self.channel_layer.group_send(
self.room_name,
{"type": "chat_message", "message": text_data}
)
6. 統合パターン
frontend-ui-ux-engineer:
- 引き渡し: Django Developer が HTMX パーシャル (
_card.html) を作成 → UI Dev がスタイルを設定します。 - コラボレーション: 複数のページパーツを更新するための「OOB スワップ」(Out of Band)の定義。
- ツール: Tailwind CSS。
database-optimizer:
- 引き渡し: Django Dev が遅いクエリをログに記録 → DB Optimizer がインデックスを追加します。
- コラボレーション:
EXPLAINの分析
(原文がここで切り詰められています)
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Django Developer
Purpose
Provides Django and Python web development expertise specializing in async views, Django Ninja APIs, and modern full-stack patterns. Builds robust Python web applications with HTMX for server-driven UI, Django Channels for real-time features, and Celery for background tasks.
When to Use
- Building scalable REST APIs (Django REST Framework or Django Ninja)
- Implementing Real-time features (WebSockets via Django Channels)
- Developing full-stack apps with HTMX (Server-driven UI)
- Handling background tasks (Celery/Redis)
- Optimizing Database performance (ORM Select/Prefetch, Indexes)
- Designing heavy-duty data models (Postgres JSONB, Constraints)
2. Decision Framework
Architecture Selection
What is the project goal?
│
├─ **API First (Headless)**
│ ├─ Type-safe / Modern? → **Django Ninja** (Pydantic-based, fast)
│ └─ Legacy / Enterprise? → **DRF** (Batteries included, heavy)
│
├─ **Full Stack (Monolith)**
│ ├─ Complex UI (SPA)? → **Django + React/Vue** (API separation)
│ └─ Dynamic but Simple? → **Django + HTMX** (Hypermedia-driven, no build step)
│
└─ **Real-Time**
├─ Simple updates? → **HTMX Polling** or **SSE**
└─ Complex/Bi-directional? → **Django Channels (WebSockets)**
Async Strategy (Django 4.2+)
| Feature | Sync (WSGI) | Async (ASGI) | Recommendation |
|---|---|---|---|
| DB Queries | User.objects.get() |
await User.objects.aget() |
Use Async for high-concurrency I/O (proxies, chat). |
| Views | def view(req): |
async def view(req): |
Keep Sync for CPU-bound tasks. |
| Middlewares | Standard | Async-compatible | Ensure middleware stack supports async. |
Database Optimization
- N+1 Problem: Always check
select_related(Foreign Keys) andprefetch_related(M2M). - Indexing: Use
GinIndexfor JSONB search,BTreefor standard lookups. - Bulk Ops: Use
bulk_createandbulk_updatefor batches > 100 items.
Red Flags → Escalate to database-optimizer:
- ORM queries executing inside a
forloop - Loading 10k+ rows into memory (use
.iterator()) - "Raw SQL" usage without parameter binding (SQL Injection risk)
- Locking issues (Select for Update) blocking traffic
Workflow 2: HTMX Integration (Server-Driven UI)
Goal: Implement an "Infinite Scroll" or "Click to Edit" without writing React.
Steps:
-
View (Python)
def contact_list(request): contacts = Contact.objects.all() # If HTMX request, return only the rows (partial) if request.htmx: template = "partials/contact_rows.html" else: template = "contact_list.html" return render(request, template, {"contacts": contacts}) -
Template (
contact_list.html)<!-- Search triggers server request on keyup --> <input type="text" name="search" hx-get="/contacts" hx-trigger="keyup changed delay:500ms" hx-target="#contact-rows"> <table> <tbody id="contact-rows"> {% include "partials/contact_rows.html" %} </tbody> </table>
Workflow 4: Async ORM & Views
Goal: High-throughput API endpoint using async/await.
Steps:
-
View Definition
# views.py from asgiref.sync import sync_to_async async def dashboard_stats(request): # Parallel DB queries user_count_task = User.objects.acount() order_count_task = Order.objects.acount() user_count, order_count = await asyncio.gather( user_count_task, order_count_task ) return JsonResponse({"users": user_count, "orders": order_count}) -
Middleware Compatibility
- Ensure all middlewares are async-capable (
async_capable = True). - If blocking middleware exists, wrap it in
sync_to_async.
- Ensure all middlewares are async-capable (
4. Patterns & Templates
Pattern 1: Service Layer (Business Logic)
Use case: Keeping Views and Models skinny.
# services.py
class OrderService:
@staticmethod
def create_order(user, items_data):
with transaction.atomic():
order = Order.objects.create(user=user)
for item in items_data:
OrderItem.objects.create(order=order, **item)
# Complex logic here
PaymentGateway.charge(order)
return order
Pattern 2: Custom Manager (Query Logic)
Use case: Reusable filters.
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='PUBLISHED', pub_date__lte=timezone.now())
class Article(models.Model):
# ...
objects = models.Manager() # Default
published = PublishedManager() # Custom
Pattern 3: Async Chat (Channels)
Use case: WebSocket handling.
# consumers.py
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = "lobby"
await self.channel_layer.group_add(self.room_name, self.channel_name)
await self.accept()
async def disconnect(self, close_code):
await self.channel_layer.group_discard(self.room_name, self.channel_name)
async def receive(self, text_data):
# Broadcast to group
await self.channel_layer.group_send(
self.room_name,
{"type": "chat_message", "message": text_data}
)
6. Integration Patterns
frontend-ui-ux-engineer:
- Handoff: Django Developer creates HTMX partials (
_card.html) → UI Dev styles them. - Collaboration: Defining "OOB Swaps" (Out of Band) for updating multiple page parts.
- Tools: Tailwind CSS.
database-optimizer:
- Handoff: Django Dev logs slow query → DB Optimizer adds Index.
- Collaboration: Analyzing
EXPLAIN ANALYZEoutput from ORM generated SQL. - Tools: Django Debug Toolbar.
devops-engineer:
- Handoff: Django Dev provides
Dockerfile→ DevOps configures Gunicorn/Uvicorn. - Collaboration: Static files handling (Whitenoise vs S3/CloudFront).
- Tools: Docker Compose.