Django Rest Framework自定义响应消息

use*_*364 5 python django django-rest-framework

我有两个关于Django Rest Framework响应消息的问题

1.

使用时,generics.ListCreateAPIViewRetrieveDestroyAPIView通常返回资源

例如,使用POST方法调用/ map /结果将像一个对象:

{
    "x_axis": "23",
    "y_axis": "25",
    "map_id": 1,
}
Run Code Online (Sandbox Code Playgroud)

我想知道我可以将此邮件编辑为自定义,如下所示吗?

{"Success":"msg blablabla"}

2.

当我使用时serializers.ValidationError,如果我使用raise serializers.ValidationError("map_id does not exist") 响应消息,我可以编写自定义消息

{"map_id":["map_id does not exist"]}
Run Code Online (Sandbox Code Playgroud)

我可以将此部件编辑为自定义,如下所示吗?

{"FAIL":"map_id does not exist"}
Run Code Online (Sandbox Code Playgroud)

我想知道这个,因为前端不想要这种格式,他们喜欢:

{"Success":"msg blablabla"}
{"Fail":"msg blablabla"}
{"USERNAME_DUPLICATE":1001}
{"FIELD_REQUIRED":1002}
Run Code Online (Sandbox Code Playgroud)

那么他们可以更方便地告诉用户操作错误原因吗?

ple*_*ong 12

1在视图上覆盖create方法并输入如下内容:

def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers)
Run Code Online (Sandbox Code Playgroud)

2在上面的代码,更改raise_exceptionFalse并返回任何你想要的,如果序列化是无效的.即:

def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid(raise_exception=False):
            return Response({"Fail": "blablal", status=status.HTTP_400_BAD_REQUEST)

        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers)
Run Code Online (Sandbox Code Playgroud)

您正在使用CBV,因此您将能够创建扩展DRF类和DRY的自定义泛型类

但是,我要说你不应该在你的回复中添加"成功"或"失败"...如果http代码是2xx,用户会知道它没问题,4xx当请求有问题时5xx您的代码(或服务器)出错,您不需要在响应正文上重复该信息,只需使用HTTP状态代码

希望这可以帮助