Django Rest Framework Response不是JSON可序列化错误

Kak*_*aji 6 python django python-3.x django-rest-framework

我在Django REST框架中具有以下自定义异常处理程序。

class ErrorMessage:
    def __init__(self, message):
        self.message = message

def insta_exception_handler(exc, context):
    response = {}

    if isinstance(exc, ValidationError):
        response['success'] = False
        response['data'] = ErrorMessage("Validation error")

    return Response(response)
Run Code Online (Sandbox Code Playgroud)

我想要一个JSON输出,如下所示

"success":false,
"data":{ "message" : "Validation error" }
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误TypeError: Object of type 'ErrorMessage' is not JSON serializable。为什么像ErrorMessage上面这样简单的类不能JSON可序列化?我怎么解决这个问题?

ozg*_*gur 6

我认为更通用的方法是创建一个序列化程序来序列化错误消息对象:

from rest_framework import serializers

class ErrorMessageSerializer(serializers.Serializer):
    message = serializers.CharField(max_length=256)
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

def insta_exception_handler(exc, context):
    ...
    serializer = ErrorMessageSerializer(ErrorMessage("Validation error"))
    response["data"] = serializer.data
    ...
Run Code Online (Sandbox Code Playgroud)


Sar*_*iev 5

它是不可序列化,因为它是一个object,它应该是dictlist或普通值。但是您可以通过使用魔法属性轻松解决您的问题__dict__

def insta_exception_handler(exc, context):
    response = {}

    if isinstance(exc, ValidationError):
        response['success'] = False
        # like this
        response['data'] = ErrorMessage("Validation error").__dict__

    return Response(response)
Run Code Online (Sandbox Code Playgroud)