ModelViewSet是最快生成可用API的路径,因它自动绑定增删改查五种HTTP动作,省去手动写get/post等方法;需配合serializers.py、models.py及DefaultRouter注册,缺一将导致500、404或空响应。

直接说结论:用 ModelViewSet + Router 是最快生成可用 API 的路径,但必须手动写 serializers.py 和配置 urls.py,跳过这两步必然 500 或空响应。
为什么 ModelViewSet 是默认起点而不是 APIView
因为 ModelViewSet 自动绑定增删改查五种 HTTP 动作,省去重复写 get()/post() 方法;而 APIView 需手动实现每个动作逻辑,适合定制化强的接口,不是“生成 API”的目标场景。
-
ModelViewSet要求你先定义好模型(models.py),否则会报AttributeError: 'NoneType' object has no attribute '_meta' - 它依赖
Serializer类做字段校验和序列化,不写serializers.py会导致ImproperlyConfigured错误 - URL 路由必须用
DefaultRouter或SimpleRouter注册,手写path()不会自动挂载list/retrieve等动作
serializers.py 怎么写才不踩坑
最简结构是继承 serializers.ModelSerializer 并指定 model 和 fields,但常见错误是漏掉 read_only_fields 或误用 extra_kwargs 导致创建失败。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 主键字段(如
id)默认可读可写,如果不想被客户端提交,加到read_only_fields = ['id'] - 外键字段若要显示关联对象的字段(比如
user.username),不能只靠depth=1,得单独定义user = serializers.CharField(source='user.username', read_only=True) -
fields = '__all__'很方便,但如果模型有FileField或ImageField,POST 时需额外处理 multipart 数据,否则返回400 Bad Request
路由注册后访问 404?检查这三处
Django REST framework 的 URL 是两级嵌套:项目级 urls.py 包含应用路由,应用级 urls.py 才注册 Router。漏掉任一级都会 404。
立即学习“Python免费学习笔记(深入)”;
- 项目
urls.py必须包含path('api/', include('myapp.urls')),不能只写path('api/', ...) - 应用
urls.py中必须实例化router = DefaultRouter(),再调用router.register(r'items', ItemViewSet),末尾还要暴露urlpatterns = router.urls - 如果用了命名空间(
app_name = 'myapp'),include()必须带参数:include(('myapp.urls', 'myapp'), namespace='myapp'),否则反向解析失败
真正卡住人的地方往往不是语法,而是序列化器没声明字段、路由没 include、或者模型迁移没跑——这三个点不确认清楚,再漂亮的 ViewSet 也返回空或 500。

















