Django ViewSet搭配Default Router时retrieve方法调用报错求助
Django ViewSet 单条查询报错修复方案
核心错误原因
调用CommentSerializer序列化单条数据时参数错误:你已经通过get_object_or_404拿到了对应主键的单条评论实例,却仍传入全量查询集,还额外传递了序列化器不支持的pk参数,直接触发参数不匹配报错。
修复后的retrieve方法代码
def retrieve(self, request, pk=None): queryset = Comment.objects.all() # 获取到的单条实例直接赋值给变量 comment = get_object_or_404(queryset, pk=pk) # 序列化器第一个参数传入单条实例,不需要额外传pk参数 result = CommentSerializer(comment) return Response(result.data)
其他需要修正的潜在问题
- 序列化器字段定义拼写错误:
comment = serializer.CharField()应改为comment = serializers.CharField()(末尾缺s) - 方法缩进错误:
get_queryset、create、update属于ViewSet的方法,你错误将其写在了序列化器的Meta类内部,需要移到CommentViewSet类下,序列化器Meta类仅保留model、fields配置即可 - 路由注册的视图类名与实际定义不一致:urls.py中注册的是
CommentsViewSet,实际定义的ViewSet类名是CommentViewSet,命名不统一会触发路由匹配错误 - 冗余字段定义:你使用的是ModelSerializer,不需要手动重复定义和模型字段完全一致的
id、created_at、updated_at属性,框架会自动完成映射
内容的提问来源于stack exchange,提问作者Phil Cho
相关产品推荐
相关产品推荐

