
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 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 管理後台
核心工作流程
- 需求分析 — 確認 Model、資料關聯與 API 端點
- 設計 Model — 建立具備適當欄位、索引與 Manager 的 Model → 執行
manage.py makemigrations與manage.py migrate;在繼續之前先驗證 Schema 是否正確 - 實作 View — 撰寫 DRF ViewSet 或 Django 5.0 的非同步 (async) View
- 驗證端點 — 在加入驗證機制前,先用簡單的
APITestCase或curl確認各端點回傳預期的 HTTP 狀態碼 - 加入驗證機制 — 設定權限 (Permissions) 與 JWT 身份驗證
- 測試 — 撰寫 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 功能時,請提供:
- 包含索引設定的 Model 定義
- 包含驗證邏輯的 Serializer
- 包含權限控制的 ViewSet 或 View
- 關於查詢最佳化的簡短說明
知識庫參考 (Knowledge Reference)
Django 5.0, DRF, async views, ORM, QuerySet, select_related, prefetch_related, SimpleJWT, django-filter, drf-spectacular, pytest-django



