如何在DRF Viewset中为各方法返回自定义响应消息?
DRF ModelViewSet 自定义各接口返回提示消息实现方案
你可以通过重写ModelViewSet内置的各请求对应方法,给返回数据追加自定义提示消息,以下是两种常用实现方式:
方案1:直接重写当前JobPostView的方法
直接在你的视图类中重写对应请求的处理方法,修改响应结构即可,完整代码如下:
from rest_framework import viewsets from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from .serializers import JobPostSerializer from .models import JobPost class JobPostView(viewsets.ModelViewSet): permission_classes = [IsAuthenticated] serializer_class = JobPostSerializer # *注意:原queryset仅写模型类名写法有误,需补全objects.all() queryset = JobPost.objects.all() # GET 列表查询 def list(self, request, *args, **kwargs): res = super().list(request, *args, **kwargs) return Response({ "code": 200, "msg": "列表查询成功", "data": res.data }) # GET 单条详情查询 def retrieve(self, request, *args, **kwargs): res = super().retrieve(request, *args, **kwargs) return Response({ "code": 200, "msg": "详情查询成功", "data": res.data }) # POST 创建 def create(self, request, *args, **kwargs): res = super().create(request, *args, **kwargs) return Response({ "code": 201, "msg": "创建成功", "data": res.data }) # PUT 全量更新 def update(self, request, *args, **kwargs): res = super().update(request, *args, **kwargs) return Response({ "code": 200, "msg": "更新成功", "data": res.data }) # PATCH 部分更新 def partial_update(self, request, *args, **kwargs): res = super().partial_update(request, *args, **kwargs) return Response({ "code": 200, "msg": "部分更新成功", "data": res.data }) # DELETE 删除 def destroy(self, request, *args, **kwargs): super().destroy(request, *args, **kwargs) # 原destroy默认返回204无内容,手动构造响应 return Response({ "code": 200, "msg": "删除成功", "data": None })
你可以根据业务需求调整code字段的取值,或者直接保留原响应的HTTP状态码即可。
方案2:封装公共Mixin复用逻辑
如果项目中有多个ViewSet都需要统一的返回结构,可以把上面的重写逻辑封装为Mixin类,所有需要该功能的视图直接继承即可:
class CustomResponseMixin: def list(self, request, *args, **kwargs): res = super().list(request, *args, **kwargs) return Response({"code": 200, "msg": "列表查询成功", "data": res.data}) def retrieve(self, request, *args, **kwargs): res = super().retrieve(request, *args, **kwargs) return Response({"code": 200, "msg": "详情查询成功", "data": res.data}) def create(self, request, *args, **kwargs): res = super().create(request, *args, **kwargs) return Response({"code": 201, "msg": "创建成功", "data": res.data}) def update(self, request, *args, **kwargs): res = super().update(request, *args, **kwargs) return Response({"code": 200, "msg": "更新成功", "data": res.data}) def partial_update(self, request, *args, **kwargs): res = super().partial_update(request, *args, **kwargs) return Response({"code": 200, "msg": "部分更新成功", "data": res.data}) def destroy(self, request, *args, **kwargs): super().destroy(request, *args, **kwargs) return Response({"code": 200, "msg": "删除成功", "data": None}) # 使用时继承Mixin即可 class JobPostView(CustomResponseMixin, viewsets.ModelViewSet): permission_classes = [IsAuthenticated] serializer_class = JobPostSerializer queryset = JobPost.objects.all()
各方法对应请求类型说明:
- list:GET 列表查询请求
- retrieve:GET 单条详情查询请求
- create:POST 创建请求
- update:PUT 全量更新请求
- partial_update:PATCH 部分更新请求
- destroy:DELETE 删除请求
内容的提问来源于stack exchange,提问作者surya raj
相关产品推荐
相关产品推荐

