关于 django-expert
面向 Django Web 应用和 REST API 开发的技能,涵盖 Django 5.0 与 Django REST Framework,并提供从模型设计到安全和测试的开发指导。
主要功能
- 01Django 模型与 ORM 指导
- 02DRF 序列化器和视图集
- 03认证与权限设置
- 04查询优化与索引
- 05使用 Django 和 DRF 测试
适用场景
- 01设计模型及其关系
- 02实现 REST API 端点
- 03优化关联对象查询
- 04配置认证和端点权限
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ jeffallan/ claude-skills --skill django-expert安装后在 Claude Code 中输入/django-expert确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/authentication.mddrf-serializers.mdmodels-orm.mdtesting-django.mdviewsets-views.md详细介绍
Django 专家
资深 Django 专家,精通 Django 5.0、Django REST Framework 和生产级 Web 应用。
何时使用此技能
- 构建 Django Web 应用或 REST API
- 设计具有恰当关系的 Django 模型
- 实现 DRF 序列化器和视图集
- 优化 Django ORM 查询
- 配置身份验证(JWT、会话)
- 自定义 Django 管理后台
核心工作流
- 分析需求 — 确定模型、关系和 API 端点
- 设计模型 — 创建包含恰当字段、索引和管理器的模型 → 运行
manage.py makemigrations和manage.py migrate;验证架构后再继续 - 实现视图 — 使用 DRF 视图集或 Django 5.0 异步视图
- 验证端点 — 添加身份验证前,使用快速的
APITestCase或curl检查,确认每个端点都返回预期的状态码 - 添加身份验证 — 权限、JWT 身份验证
- 测试 — Django TestCase、APITestCase
参考指南
根据上下文加载详细指南:
| 主题 | 参考文档 | 加载时机 |
|---|---|---|
| 模型 | references/models-orm.md | 创建模型、ORM 查询、优化 |
| 序列化器 | references/drf-serializers.md | DRF 序列化器、验证 |
| 视图集 | references/viewsets-views.md | 视图、视图集、异步视图 |
| 身份验证 | references/authentication.md | JWT、权限、SimpleJWT |
| 测试 | references/testing-django.md | APITestCase、fixtures、工厂 |
最小可运行示例
以下代码片段展示了核心的 MUST DO 约束:索引字段、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 功能时,请提供:
- 带索引的模型定义
- 带验证的序列化器
- 带权限控制的视图集或视图
- 关于查询优化的简短说明
知识参考
Django 5.0、DRF、异步视图、ORM、QuerySet、select_related、prefetch_related、SimpleJWT、django-filter、drf-spectacular、pytest-django
由 @jeffallan 维护;他是 Synergetic Solutions 的首席顾问
评论
支持 Markdown