【问题标题】:Django customise response for success and fail成功和失败的 Django 自定义响应
【发布时间】:2018-07-31 14:39:01
【问题描述】:

我想为我的序列化程序的 1 个成功和失败创建自定义响应。现在我只有成功的创建功能

我希望输出显示为默认输出 + 我的其他 2 条消息。

提示消息和状态。

例如json数据的输出:如果成功:

promptmsg = "您已成功创建 xxx"
状态 = '200'

如果失败

promptmsg = "你创建 xxx 失败"
状态 = '400'

这是我的观点的代码

class ScheduleViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Schedule.objects.all()
    serializer_class = ScheduleSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            return Response({"promptmsg": "You have failed to register an account",
                             "status": "400"}, status=HTTP_400_BAD_REQUEST)

        response = super(ScheduleViewSet, self).create(request, *args, **kwargs)
        response.data['promptmsg'] = 'You have successfully create a book'
        response.data['statuscode'] = '200'
        return response

    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        if not serializer.is_valid(raise_exception=False):
            return Response({"promptmsg": "You have failed to register an account",
                             "statuscode": "400"}, status=HTTP_400_BAD_REQUEST)

        # serializer.is_valid(raise_exception=True)
        # self.perform_update(serializer)
        response = super(ScheduleViewSet, self).update(request, *args, **kwargs)
        response.data['promptmsg'] = 'You have successfully create a book'
        response.data['statuscode'] = '200'
        return response

如你所见,如果失败,它只会返回 promptmsg 和 status。

如果成功会显示默认响应+promptmsg+状态。

那我怎么改呢?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    如果我理解正确,您需要在自定义错误响应中添加错误详细信息,以防序列化失败?在这种情况下,您可以使用serializer.errors 属性:

    if not serializer.is_valid(raise_exception=False):
        errors_details = serializer.errors
        errors_details["promptmsg"] = "You have failed to register an account"
        errors_details["status"] = "400"
        return Response(errors_details, status=HTTP_400_BAD_REQUEST)
    

    【讨论】:

    • 谢谢。这正是我想要的
    【解决方案2】:

    你可以继承 Response 类:

    from rest_framework.response import Response
    
    class MyResponse(Response):
    def __init__(self, data=None, status=None, headers=None,
                 exception=False, content_type=None):
        # here you can create your custom fields etc...
        result = {
            'status': status,
            'message': data,
        }
        super(MyResponse, self).__init__(data=result, 
                                          headers=headers, 
                                          status=status, 
                                          exception=exception, 
                                          content_type=content_type)
    

    稍后只需在视图中使用“MyResponse()”而不是“Response”

    【讨论】:

    • 所以这更可定制?谢谢。
    • 是的,在这里您可以格式化您的 json 响应将包含哪些字段和值
    猜你喜欢
    • 2021-08-07
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多