django-developer について
DjangoでPythonウェブアプリを開発する人向けのスキルです。API、非同期ビュー、HTMXのUI、リアルタイム機能、バックグラウンドタスクを扱い、設計選択やORM最適化、実装パターンも示します。
主な機能
- 01Django NinjaとDRFのAPI指針
- 02非同期ビューとORMパターン
- 03HTMXのサーバー駆動UI
- 04Django ChannelsのWebSocket
- 05Celeryのバックグラウンドタスク
- 06ORMとデータベースの最適化
活用シーン
- 01REST APIの構築
- 02WebSocket機能の追加
- 03HTMXによるフルスタックアプリの作成
- 04バックグラウンドジョブの処理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ 404kidwiz/ claude-supercode-skills --skill django-developerインストール後、Claude Code で/django-developerを入力して読み込まれたか確認します。
詳細
Django 開発者
目的
非同期ビュー、Django Ninja API、最新のフルスタックパターンを専門とする、Django および Python のウェブ開発に関する専門知識を提供します。サーバー主導の UI を実現する HTMX、リアルタイム機能を実現する Django Channels、バックグラウンドタスクを実現する Celery を活用し、堅牢な Python ウェブアプリケーションを構築します。
使用する場面
- スケーラブルな REST API の構築(Django REST Framework または Django Ninja)
- リアルタイム機能の実装(Django Channels 経由の WebSocket)
- HTMX を使ったフルスタックアプリの開発(サーバー主導の UI)
- バックグラウンドタスクの処理(Celery/Redis)
- データベースパフォーマンスの最適化(ORM の Select/Prefetch、インデックス)
- 大規模なデータモデルの設計(Postgres JSONB、制約)
2. 意思決定フレームワーク
アーキテクチャの選択
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)**
非同期処理の方針(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(多対多)を必ず確認します。 - インデックス作成: JSONB 検索には
GinIndex、標準的な検索にはBTreeを使用します。 - 一括操作: 100 件を超えるバッチには
bulk_createとbulk_updateを使用します。
危険な兆候 → database-optimizer にエスカレーションしてください:
forループ内で ORM クエリが実行されている- 1 万行を超えるデータをメモリに読み込んでいる(
.iterator()を使用します) - パラメータバインディングなしで「Raw SQL」を使用している(SQL インジェクションのリスク)
- ロックの問題(Select for Update)によりトラフィックが滞っている
ワークフロー 2:HTMX の統合(サーバー主導の UI)
目標: React を書かずに「無限スクロール」または「クリックして編集」を実装します。
手順:
-
ビュー(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}) -
テンプレート(
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): # 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}) -
ミドルウェアの互換性
- すべてのミドルウェアが非同期に対応していること(
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)
# Complex logic here
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() # Default
published = PublishedManager() # Custom
パターン 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):
# Broadcast to group
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 がインデックスを追加します。
- 連携: ORM が生成した SQL の
EXPLAIN ANALYZEの出力を分析します。 - ツール: Django Debug Toolbar。
devops-engineer:
- 引き継ぎ: Django Dev が
Dockerfileを提供し、DevOps が Gunicorn/Uvicorn を設定します。 - 連携: 静的ファイルの処理(Whitenoise と S3/CloudFront の比較)。
- ツール: Docker Compose。
コメント
Markdown 対応