Django Rest Framework自定义响应信息

20

我对 Django Rest Framework 响应消息有两个问题。

1.

当使用 generics.ListCreateAPIViewRetrieveDestroyAPIView 时,通常会返回一个资源。

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

{
    "x_axis": "23",
    "y_axis": "25",
    "map_id": 1,
}

我想知道我是否可以编辑此消息以自定义如下:

{"Success":"msg blablabla"}

2.

当我使用serializers.ValidationError时, 如果我使用raise serializers.ValidationError("map_id does not exist"), 则响应消息将是:

{"map_id":["map_id does not exist"]}

我可以将这部分自定义修改为以下内容吗?

{"FAIL":"map_id does not exist"}

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

{"Success":"msg blablabla"}
{"Fail":"msg blablabla"}
{"USERNAME_DUPLICATE":1001}
{"FIELD_REQUIRED":1002}

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

1个回答

33

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)

在上面的代码中,将raise_exception更改为False,如果序列化程序无效,则返回您想要的内容。即:


在上面的代码中,将raise_exception更改为False,如果序列化程序无效,则返回您想要的内容。即:
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)
您正在使用CBV,因此您将能够创建自定义的通用类,继承DRF的类,并且能够使代码更加干净简洁。
但是,我认为您不应该在响应中添加“成功”或“失败”这样的信息……如果HTTP代码是2xx,用户就会知道一切正常;4xx表示请求有问题,5xx表示发生了错误(可能是您的代码出错或服务端出错),您不需要在响应体中再次重复这些信息,只需使用HTTP状态码即可。
希望对您有所帮助。

非常感谢!它有效。我还有一个问题。它总是返回“Fail”:“blablal”,我该如何分离消息:它是“map_id不存在”或“此字段为必填项”或“此字段已存在”在响应中? - user2492364
1
另一个问题是我在网页方面缺乏经验。检查状态码2XX、4XX是一种正常的方法,对吧?前端似乎不想检查状态码,他们只想检查响应消息。 - user2492364
你可以使用serializer.errors来自定义错误。而且是的,前端应该检查状态码。 - pleasedontbelong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接