直接用 APIView 而非函数视图,因其自动解析 request.data 和 query_params、内置异常处理与响应封装;ModelSerializer 外键默认序列化为 ID,可用 StringRelatedField、PrimaryKeyRelatedField 或嵌套序列化器解决;API 路由应统一前缀并用 DefaultRouter 管理;settings.py 中 DEFAULT_RENDERER_CLASSES、DATETIME_FORMAT、PAGE_SIZE 三项最易被忽略。

为什么直接用 APIView 而不是函数视图写 REST 接口
函数视图(def 视图)写简单接口快,但一涉及请求体解析、字段校验、状态码控制、分页、权限判断,代码就迅速膨胀。而 APIView 是 DRF 的基础类视图,它自动处理了 request.data(JSON 解析)、request.query_params(代替 request.GET),还内置了异常处理器和响应封装。
常见错误是把 APIView 当成普通类视图用,忘了重写 get、post 等方法,或者漏掉 self.permission_classes = [...] 导致权限不生效。
- 必须继承
APIView,不能只写个普通类 - 方法名必须小写且匹配 HTTP 动词:
get、post、put、delete - 返回必须用
Response(来自rest_framework.response),不能用 Django 的HttpResponse
如何让 ModelSerializer 正确处理外键和嵌套关系
ModelSerializer 默认把外键字段序列化成 ID,比如 author: 3,但前端通常需要作者名或完整对象。这不是 bug,是设计选择——避免 N+1 查询和循环引用。
要显示关联字段内容,有三个常用方式:
立即学习“Python免费学习笔记(深入)”;
- 用
StringRelatedField:适合只读展示,如author = serializers.StringRelatedField(read_only=True)→ 输出"author": "Alice" - 用
PrimaryKeyRelatedField:支持读写,但写入时传 ID 即可,如author = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) - 用嵌套序列化器:需手动定义
author = UserSerializer(read_only=True),但要注意加read_only=True或在create()中重写逻辑,否则保存会报错
容易踩的坑:在嵌套序列化器中没设 read_only=True,又没重写 create 方法,POST 时就会触发 TypeError: Object of type User is not JSON serializable。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
URL 路由怎么配才不和 Django 普通路由冲突
DRF 推荐把 API 路由集中到一个 api/ 前缀下,并用 DefaultRouter 或 SimpleRouter 自动生成 CRUD 路径。别在主 urls.py 里用 path('', ...) 直接挂载,否则可能被前面的 path('<slug>/', ...)</slug> 拦截。
典型配置方式:
# api/urls.py from rest_framework.routers import DefaultRouter from .views import BookViewSet <p>router = DefaultRouter() router.register(r'books', BookViewSet, basename='book') urlpatterns = router.urls
然后在主 urls.py 中 include:
path('api/', include('myapp.api.urls')),
-
basename必须显式指定,尤其当视图集没有queryset属性时(比如用get_queryset()动态返回) - 不要在
BookViewSet的list方法里手动写return JsonResponse(...),这会绕过 DRF 的渲染器和内容协商 - 如果要用非标准动作(如
/books/latest/),得加@action(methods=['get'], detail=False),并确认是否需要url_path参数
settings.py 里哪些 DRF 配置项最容易被忽略
很多项目跑起来没问题,但上线后发现分页失效、时间格式混乱、404 返回 HTML 而不是 JSON——问题常出在全局配置漏设。
以下三项必须检查:
-
REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES']:至少包含'rest_framework.renderers.JSONRenderer',否则浏览器直接访问 API URL 会返回 HTML 页面 -
REST_FRAMEWORK['DATETIME_FORMAT']:默认是'iso-8601',但若前端要求'%Y-%m-%d %H:%M:%S',就得显式覆盖,否则时间字段序列化后是字符串但格式不符 -
REST_FRAMEWORK['PAGE_SIZE']:不设的话分页器不会自动启用;配合'DEFAULT_PAGINATION_CLASS'才生效,缺一不可
另外,开发期建议加上 'rest_framework.renderers.BrowsableAPIRenderer' 到 DEFAULT_RENDERER_CLASSES,它提供网页调试界面,但生产环境务必移除——否则暴露敏感字段和测试入口。


















