You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:54:03