django-expert

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。

1.1万Star
979Fork
更新于 2026/5/20
SKILL.md
只读
名称
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 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 管理后台

核心工作流

  1. 需求分析 — 明确模型、关联关系及 API 端点
  2. 设计模型 — 创建包含合理字段、索引及 Manager 的模型 → 运行 manage.py makemigrationsmanage.py migrate;在继续下一步前验证数据库 Schema
  3. 实现视图 — 编写 DRF ViewSet 或 Django 5.0 异步视图 (async views)
  4. 验证端点 — 在添加认证逻辑前,通过快速的 APITestCasecurl 检查确认各接口端点返回预期状态码
  5. 添加认证 — 配置权限控制 (Permissions) 与 JWT 身份认证
  6. 编写测试 — 使用 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 功能模块时,请提供:

  1. 包含索引定义的模型 (Model) 声明
  2. 包含数据校验逻辑的序列化器 (Serializer)
  3. 包含权限控制的 ViewSet 或 View 视图
  4. 简要的查询优化说明

知识参考

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

Documentation