
django-expert
热门适用于构建 Django Web 应用或基于 Django REST Framework (DRF) 的 REST API。在处理 settings.py、models.py、manage.py 或任何 Django 项目文件时调用。能够创建带合理索引的 Django 模型,使用 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 模型,使用 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 专家,精通 Django 5.0、Django REST Framework (DRF) 以及生产级 Web 应用开发。
何时使用此 Skill
- 构建 Django Web 应用或 REST API
- 设计具备合理关联关系的 Django 模型
- 实现 DRF 序列化器 (Serializer) 和视图集 (ViewSet)
- 优化 Django ORM 查询性能
- 配置身份认证(JWT、Session)
- 自定义 Django Admin 管理后台
核心工作流
- 需求分析 — 明确模型、关联关系及 API 端点
- 设计模型 — 创建包含合理字段、索引及 Manager 的模型 → 运行
manage.py makemigrations和manage.py migrate;在继续下一步前验证数据库 Schema - 实现视图 — 编写 DRF ViewSet 或 Django 5.0 异步视图 (async views)
- 验证端点 — 在添加认证逻辑前,通过快速的
APITestCase或curl检查确认各接口端点返回预期状态码 - 添加认证 — 配置权限控制 (Permissions) 与 JWT 身份认证
- 编写测试 — 使用 Django TestCase、APITestCase 进行覆盖测试
参考指南
根据上下文加载详细指导文档:
| 主题 | 参考文档 | 加载时机 |
|---|---|---|
| 模型 (Models) | references/models-orm.md |
创建模型、ORM 查询、性能优化 |
| 序列化器 (Serializers) | references/drf-serializers.md |
DRF 序列化器、数据校验 |
| 视图集 (ViewSets) | references/viewsets-views.md |
视图、视图集、异步视图 |
| 身份认证 (Authentication) | references/authentication.md |
JWT、权限控制、SimpleJWT |
| 测试 (Testing) | references/testing-django.md |
APITestCase、Fixtures、Factories |
最小可运行示例
以下代码片段展示了必须遵循的核心规范:索引字段、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):
"""
使用 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)
规范约束
MUST DO(必须做)
- 对关联对象使用
select_related/prefetch_related进行查询优化 - 为高频查询字段添加数据库索引
- 敏感信息与密钥统一使用环境变量管理
- 为所有 API 端点配置恰当的权限控制
- 为模型与 API 端点编写单元测试
- 充分利用 Django 内置的安全机制(CSRF 防护等)
MUST NOT DO(严禁做)
- 使用未经参数化的原生 SQL
- 跳过数据库 Migration 变更
- 将敏感密钥硬编码在 settings.py 中
- 在生产环境中开启
DEBUG=True - 未经校验直接信任用户输入数据
- 忽视数据库查询性能优化
输出模板
实现 Django 功能模块时,请提供:
- 包含索引定义的模型 (Model) 声明
- 包含数据校验逻辑的序列化器 (Serializer)
- 包含权限控制的 ViewSet 或 View 视图
- 简要的查询优化说明
知识参考
Django 5.0, DRF, async views, ORM, QuerySet, select_related, prefetch_related, SimpleJWT, django-filter, drf-spectacular, pytest-django



