mcpField
D
django-expert

django-expert

github.com/jeffallan開発12.1k4.3k 回インストール1 日前に更新
リポジトリ

django-expert について

Django WebアプリやREST APIを開発するエンジニア向けのスキルです。Django 5.0とDjango REST Frameworkを対象に、モデル設計からセキュリティ、テストまでの指針を提供します。

主な機能

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

活用シーン

  1. 01モデルとリレーションの設計
  2. 02REST APIエンドポイントの実装
  3. 03関連オブジェクトのクエリ最適化
  4. 04認証とエンドポイント権限の設定

インストール

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

$npx skills add https://github.com/jeffallan/claude-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="<test-password>")

    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

@jeffallan(Synergetic Solutionsのプリンシパルコンサルタント)がメンテナンスしています

ドキュメント

コメント