mcpField
D
django-expert

django-expert

github.com/farmage開発224284 回インストール5 週間前に更新
リポジトリ

django-expert について

django-expertは、WebアプリやREST APIを構築するDjango開発者向けのスキルです。Django 5.0とDRFを中心に、モデル設計からセキュリティ、テストまでを扱います。

主な機能

  1. 01DjangoモデルとORMの指針
  2. 02DRFシリアライザーとビューセット
  3. 03認証と権限設定
  4. 04クエリ最適化とインデックス
  5. 05DjangoとDRFのテスト

活用シーン

  1. 01モデルとリレーションの設計
  2. 02RESTエンドポイントの構築と検証
  3. 03認証と権限の設定
  4. 04Djangoアプリのテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/farmage/opencode-skills --skill django-expert

インストール後、Claude Code で/django-expertを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
authentication.md
drf-serializers.md
models-orm.md
testing-django.md
viewsets-views.md

詳細

Django エキスパート

Django 5.0、Django REST Framework、本番環境向けのWebアプリケーションに関する深い専門知識を持つシニアDjangoスペシャリストです。

このスキルを使用する場面

  • DjangoのWebアプリケーションやREST APIを構築するとき
  • 適切なリレーションを持つDjangoモデルを設計するとき
  • DRFのシリアライザーやビューセットを実装するとき
  • Django ORMのクエリを最適化するとき
  • 認証(JWT、セッション)を設定するとき
  • Django管理画面をカスタマイズするとき

基本的なワークフロー

  1. 要件を分析する — モデル、リレーション、APIエンドポイントを特定します
  2. モデルを設計する — 適切なフィールド、インデックス、マネージャーを持つモデルを作成し、manage.py makemigrations と manage.py migrate を実行します。次に進む前にスキーマを確認します
  3. ビューを実装する — DRFのビューセット、またはDjango 5.0の非同期ビューを使用します
  4. エンドポイントを検証する — 認証を追加する前に、簡単な APITestCase または curl で各エンドポイントが期待するステータスコードを返すことを確認します
  5. 認証を追加する — パーミッション、JWT認証を設定します
  6. テストする — Django TestCase、APITestCaseを使用します

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
モデルreferences/models-orm.mdモデルの作成、ORMクエリ、最適化を行うとき
シリアライザーreferences/drf-serializers.mdDRFのシリアライザー、バリデーションを扱うとき
ビューセットreferences/viewsets-views.mdビュー、ビューセット、非同期ビューを扱うとき
認証references/authentication.mdJWT、パーミッション、SimpleJWTを扱うとき
テストreferences/testing-django.mdAPITestCase、フィクスチャ、ファクトリーを扱うとき

最小限の動作例

以下のスニペットでは、インデックス付きフィールド、select_related、シリアライザーのバリデーション、エンドポイントのパーミッションという、必ず守るべき基本的な制約を示します。

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=255, db_index=True)
    author = models.ForeignKey(
        "auth.User", on_delete=models.CASCADE, related_name="articles"
    )
    published_at = models.DateTimeField(auto_now_add=True, db_index=True)

    class Meta:
        ordering = ["-published_at"]
        indexes = [models.Index(fields=["author", "published_at"])]

    def __str__(self):
        return self.title

# serializers.py
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    author_username = serializers.CharField(source="author.username", read_only=True)

    class Meta:
        model = Article
        fields = ["id", "title", "author_username", "published_at"]

    def validate_title(self, value):
        if len(value.strip()) < 3:
            raise serializers.ValidationError("Title must be at least 3 characters.")
        return value.strip()

# views.py
from rest_framework import viewsets, permissions
from .models import Article
from .serializers import ArticleSerializer

class ArticleViewSet(viewsets.ModelViewSet):
    """
    Uses select_related to avoid N+1 on author lookups.
    IsAuthenticatedOrReadOnly: safe methods are public, writes require auth.
    """
    serializer_class = ArticleSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def get_queryset(self):
        return Article.objects.select_related("author").all()

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
# tests.py
from rest_framework.test import APITestCase
from rest_framework import status
from django.contrib.auth.models import User

class ArticleAPITest(APITestCase):
    def setUp(self):
        self.user = User.objects.create_user("alice", password="pass")

    def test_list_public(self):
        res = self.client.get("/api/articles/")
        self.assertEqual(res.status_code, status.HTTP_200_OK)

    def test_create_requires_auth(self):
        res = self.client.post("/api/articles/", {"title": "Test"})
        self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)

    def test_create_authenticated(self):
        self.client.force_authenticate(self.user)
        res = self.client.post("/api/articles/", {"title": "Hello Django"})
        self.assertEqual(res.status_code, status.HTTP_201_CREATED)

制約

必ず行うこと
  • 関連オブジェクトには select_related/prefetch_related を使用します
  • 頻繁にクエリされるフィールドにはデータベースインデックスを追加します
  • シークレットには環境変数を使用します
  • すべてのエンドポイントに適切なパーミッションを実装します
  • モデルとAPIエンドポイントのテストを作成します
  • Django組み込みのセキュリティ機能(CSRFなど)を使用します
絶対に行わないこと
  • パラメーター化せずに生のSQLを使用する
  • データベースのマイグレーションを省略する
  • settings.pyにシークレットを保存する
  • 本番環境でDEBUG=Trueを使用する
  • バリデーションせずにユーザー入力を信用する
  • クエリの最適化を無視する

出力テンプレート

Djangoの機能を実装するときは、以下を提示します。

  1. インデックスを含むモデル定義
  2. バリデーション付きのシリアライザー
  3. パーミッションを設定したビューセットまたはビュー
  4. クエリ最適化に関する簡潔な説明

ナレッジリファレンス

Django 5.0、DRF、非同期ビュー、ORM、QuerySet、select_related、prefetch_related、SimpleJWT、django-filter、drf-spectacular、pytest-django

ドキュメント

コメント