$npx -y skills add youlaitech/youlai-skills --skill djangoDjango REST Framework backend development standards. Use this skill when developing Django projects, implementing REST APIs with DRF ViewSets, Serializers, or JWT authentication.
| 1 | # Django REST Framework 后端开发规范 |
| 2 | |
| 3 | ## 触发条件 |
| 4 | |
| 5 | - Develop Django projects |
| 6 | - Implement REST APIs |
| 7 | - Use DRF ViewSets and Serializers |
| 8 | - Implement JWT authentication |
| 9 | - Implement permission control |
| 10 | |
| 11 | --- |
| 12 | |
| 13 | ## Part 1: 技术栈 |
| 14 | |
| 15 | | 层 | 选型 | 说明 | |
| 16 | |----|------|------| |
| 17 | | 运行环境 | **Python 3.11+** | 类型注解增强 | |
| 18 | | Web 框架 | **Django 4.2+** | 全栈框架、ORM 内置 | |
| 19 | | REST API | **Django REST Framework (DRF)** | ViewSet、Serializer、认证 | |
| 20 | | 数据库 | **MySQL 8.x** (mysqlclient) | InnoDB 引擎 | |
| 21 | | 缓存 | **Redis 7.x** (django-redis) | 分布式缓存 | |
| 22 | | 认证 | **PyJWT** + DRF Authentication | Token 签发/验签 | |
| 23 | | API 文档 | **drf-spectacular** | OpenAPI 3.0 自动生成 | |
| 24 | |
| 25 | --- |
| 26 | |
| 27 | ## Part 2: 目录结构 |
| 28 | |
| 29 | ``` |
| 30 | project/ |
| 31 | ├── apps/ # 应用模块 |
| 32 | │ ├── system/ # 系统管理(Django App) |
| 33 | │ │ ├── users/ # 用户管理(models, serializers, views, urls, filters) |
| 34 | │ │ ├── roles/ # 角色管理 |
| 35 | │ │ ├── menus/ # 菜单管理 |
| 36 | │ │ ├── dept/ # 部门管理 |
| 37 | │ │ ├── dicts/ # 字典管理 |
| 38 | │ │ ├── configs/ # 系统配置 |
| 39 | │ │ ├── notices/ # 通知公告 |
| 40 | │ │ ├── logs/ # 日志管理 |
| 41 | │ │ └── utils/ # decorators, exception_handler, rate_limit |
| 42 | │ ├── auth/ # 认证模块 |
| 43 | │ │ ├── views.py, serializers.py, urls.py |
| 44 | │ │ ├── utils/ # jwt_authentication, redis_token_authentication |
| 45 | │ │ └── models/ # user_session, user_social |
| 46 | │ ├── codegen/ # 代码生成器(models, views, urls, templates/) |
| 47 | │ ├── file/ # 文件管理 |
| 48 | │ └── message/ # 消息模块(SSE) |
| 49 | ├── core/ # 公共模块 |
| 50 | │ ├── response.py # 统一响应 + 分页 |
| 51 | │ ├── viewsets.py # ViewSet 基类 |
| 52 | │ ├── serializers.py # Serializer 基类 |
| 53 | │ ├── exceptions/ # BusinessException + 全局处理器 |
| 54 | │ ├── permissions/ # 接口权限 + 数据权限 |
| 55 | │ └── middleware/ # rate_limit, request_context |
| 56 | ├── config/ # 项目配置 |
| 57 | │ ├── settings/{base,dev,prod}.py |
| 58 | │ ├── urls.py # 根路由 |
| 59 | │ └── env.py |
| 60 | ├── sql/mysql/youlai_admin_django.sql |
| 61 | ├── manage.py |
| 62 | └── requirements.txt |
| 63 | ``` |
| 64 | |
| 65 | **设计原则**: |
| 66 | - `core/` 是公共基础设施,被所有 App 共享,不依赖业务 App |
| 67 | - `apps/` 中每 App 按实体分子模块(user/role/menu),每子模块含 models/serializers/views/urls/filters |
| 68 | - ViewSet + Serializer 是标准模式,复杂业务逻辑抽到 `services.py` |
| 69 | |
| 70 | --- |
| 71 | |
| 72 | ## Part 3: 命名规范 |
| 73 | |
| 74 | ### 3.1 文件命名 |
| 75 | |
| 76 | | 类型 | 规范 | 示例 | |
| 77 | |------|------|------| |
| 78 | | 模块目录 | 小写复数 | `users/`, `roles/`, `menus/` | |
| 79 | | 模型 | `models.py` | `apps/system/users/models.py` | |
| 80 | | Serializer | `serializers.py` | 同上 | |
| 81 | | 视图 | `views.py` | 同上 | |
| 82 | | 路由 | `urls.py` | 同上 | |
| 83 | | 过滤器 | `filters.py` | 同上 | |
| 84 | |
| 85 | ### 3.2 类命名 |
| 86 | |
| 87 | | 类型 | 规范 | 示例 | |
| 88 | |------|------|------| |
| 89 | | 模型 | PascalCase,Sys 前缀 | `SysUser`, `SysRole`, `SysMenu` | |
| 90 | | Serializer | 功能 + Serializer | `UserSerializer`, `UserFormSerializer` | |
| 91 | | ViewSet | 功能 + ViewSet | `UserViewSet` | |
| 92 | | Filter | 功能 + Filter | `UserFilter` | |
| 93 | |
| 94 | ### 3.3 方法命名 |
| 95 | |
| 96 | | 动作 | DRF 内置方法 | 自定义 action | |
| 97 | |------|-------------|---------------| |
| 98 | | 查询列表 | `list()` | `page()` | |
| 99 | | 查询详情 | `retrieve()` | — | |
| 100 | | 新增 | `create()` | — | |
| 101 | | 更新 | `update()` | — | |
| 102 | | 删除 | `destroy()` | — | |
| 103 | | 批量删除 | — | `batch()` | |
| 104 | | 下拉选项 | — | `options()` | |
| 105 | |
| 106 | ### 3.4 变量命名 |
| 107 | |
| 108 | | 类型 | 规范 | 示例 | |
| 109 | |------|------|------| |
| 110 | | 变量 | snake_case | `user_list` | |
| 111 | | 常量 | UPPER_SNAKE_CASE | `MAX_PAGE_SIZE` | |
| 112 | | 私有方法 | `_` 前缀 | `_parse_date()` | |
| 113 | | 布尔值 | is_/has_ 前缀 | `is_deleted`, `has_permission` | |
| 114 | |
| 115 | --- |
| 116 | |
| 117 | ## Part 4: RESTful API 规范 |
| 118 | |
| 119 | ### 4.1 标准 CRUD 路径 |
| 120 | |
| 121 | | 操作 | 方法 | 路径 | |
| 122 | |------|------|------| |
| 123 | | 分页列表 | `GET` | `/api/v1/users/page/` | |
| 124 | | 详情 | `GET` | `/api/v1/users/{id}/` | |
| 125 | | 新增 | `POST` | `/api/v1/users/` | |
| 126 | | 更新 | `PUT` | `/api/v1/users/{id}/` | |
| 127 | | 删除 | `DELETE` | `/api/v1/users/{id}/` | |
| 128 | | 批量删除 | `DELETE` | `/api/v1/users/batch/` | |
| 129 | | 下拉选项 | `GET` | `/api/v1/users/options/` | |
| 130 | |
| 131 | ### 4.2 ViewSet 模板 |
| 132 | |
| 133 | ```python |
| 134 | @extend_schema(tags=["用户管理"]) |
| 135 | class UserViewSet(ModelViewSet): |
| 136 | queryset = SysUser.objects.all() |
| 137 | serializer_class = UserSerializer |
| 138 | filterset_class = UserFilter |
| 139 | permission_classes = [HasPermission] |
| 140 | |
| 141 | @extend_schema(summary="用户分页列表") |
| 142 | @action(detail=False, methods=["get"]) |
| 143 | def page(self, request): |
| 144 | queryset = self.filter_queryset(self.get_queryset()) |
| 145 | page = self.paginate_queryset(queryset) |
| 146 | return page_result(self.get_serializer(page, many=True).data, self.paginator.count) |
| 147 | |
| 148 | @extend_schema(summary="新增用户") |
| 149 | def create(self, request, *args, **kwargs): |
| 150 | serializer = UserFormSerializer(data=request.data) |
| 151 | serializer.is_valid(raise_exception=True) |
| 152 | user = serializer.save() |
| 153 | return success_result({"id": user.id}) |
| 154 | |
| 155 | @extend_schema(summary="更新用户") |
| 156 | def update(self, request, *args, **kwargs): |
| 157 | instance = self.get_object() |
| 158 | serializer = User |