django-expert

django-expert

熱門

適用於開發 Django Web 應用程式或搭配 Django REST Framework (DRF) 打造 REST API 的情境。當你處理 settings.py、models.py、manage.py 或任何 Django 專案檔案時即可調用。支援建立具備適當索引的 Django Model、使用 select_related/prefetch_related 最佳化 ORM 查詢、撰寫 DRF Serializer 與 ViewSet,以及設定 JWT 驗證。觸發詞:Django, DRF, Django REST Framework, Django ORM, Django model, serializer, viewset, Python web。

1.1萬星標
979分支
更新於 2026/5/20
SKILL.md
唯讀
名稱
django-expert
描述

適用於開發 Django Web 應用程式或搭配 Django REST Framework (DRF) 打造 REST API 的情境。當你處理 settings.py、models.py、manage.py 或任何 Django 專案檔案時即可調用。支援建立具備適當索引的 Django Model、使用 select_related/prefetch_related 最佳化 ORM 查詢、撰寫 DRF Serializer 與 ViewSet,以及設定 JWT 驗證。觸發詞:Django, DRF, Django REST Framework, Django ORM, Django model, serializer, viewset, Python web。

Django Expert

資深 Django 專家,精通 Django 5.0、Django REST Framework 以及生產級 Web 應用程式開發。

何時使用此 Skill

  • 建立 Django Web 應用程式或 REST API
  • 設計具備適當關聯的 Django Model
  • 實作 DRF Serializer 與 ViewSet
  • 最佳化 Django ORM 查詢
  • 設定身份驗證機制(JWT、Session)
  • 客製化 Django Admin 管理後台

核心工作流程

  1. 需求分析 — 確認 Model、資料關聯與 API 端點
  2. 設計 Model — 建立具備適當欄位、索引與 Manager 的 Model → 執行 manage.py makemigrationsmanage.py migrate;在繼續之前先驗證 Schema 是否正確
  3. 實作 View — 撰寫 DRF ViewSet 或 Django 5.0 的非同步 (async) View
  4. 驗證端點 — 在加入驗證機制前,先用簡單的 APITestCasecurl 確認各端點回傳預期的 HTTP 狀態碼
  5. 加入驗證機制 — 設定權限 (Permissions) 與 JWT 身份驗證
  6. 測試 — 撰寫 Django TestCase、APITestCase

參考指南

根據開發情境載入詳細指引:

主題 參考文件 載入時機
Model references/models-orm.md 建立 Model、處理 ORM 查詢與最佳化
Serializer references/drf-serializers.md 實作 DRF Serializer 與資料驗證
ViewSet references/viewsets-views.md 撰寫 View、ViewSet 與非同步 View
身份驗證 references/authentication.md 設定 JWT、權限與 SimpleJWT
測試 references/testing-django.md 撰寫 APITestCase、Fixture 與 Factory

最簡可運作範例 (Minimal Working Example)

以下程式碼片段示範了核心的「必要守則 (MUST DO)」限制:設定欄位索引、使用 select_related、Serializer 資料驗證,以及 API 端點權限控制。

# 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):
    """
    使用 select_related 避免查詢 author 時產生 N+1 問題。
    IsAuthenticatedOrReadOnly:安全方法開放公開存取,寫入操作則需身份驗證。
    """
    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)

規範與限制 (Constraints)

必要守則 (MUST DO)

  • 存取關聯物件時務必使用 select_related/prefetch_related
  • 為高頻查詢欄位建立資料庫索引
  • 使用環境變數管理敏感資訊 (Secrets)
  • 為所有 API 端點實作適當的權限控制 (Permissions)
  • 為 Model 與 API 端點撰寫測試
  • 善用 Django 內建的安全功能(如 CSRF 防護等)

嚴禁事項 (MUST NOT DO)

  • 嚴禁使用未經參數化的原生 SQL (Raw SQL)
  • 嚴禁跳過資料庫 Migration
  • 嚴禁將敏感資訊儲存在 settings.py
  • 嚴禁在生產環境開啟 DEBUG=True
  • 嚴禁未經驗證直接信任使用者輸入
  • 嚴禁忽視查詢的最佳化

輸出範本 (Output Templates)

實作 Django 功能時,請提供:

  1. 包含索引設定的 Model 定義
  2. 包含驗證邏輯的 Serializer
  3. 包含權限控制的 ViewSet 或 View
  4. 關於查詢最佳化的簡短說明

知識庫參考 (Knowledge Reference)

Django 5.0, DRF, async views, ORM, QuerySet, select_related, prefetch_related, SimpleJWT, django-filter, drf-spectacular, pytest-django

Documentation