web-dev-qa-db-ja.com

Django RestFrameworkの応答はJSONシリアル化可能なエラーではありません

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)

以下に示すようなJSON出力が必要です

"success":false,
"data":{ "message" : "Validation error" }

しかし、エラーが発生しますTypeError: Object of type 'ErrorMessage' is not JSON serializable。上記のErrorMessageのように単純なクラスがJSONシリアル化できないのはなぜですか?どうすればこの問題を解決できますか?

7
Kakaji

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)
5

より一般的な方法は、エラーメッセージオブジェクトをシリアル化するためのシリアライザーを作成することだと思います。

from rest_framework import serializers

class ErrorMessageSerializer(serializers.Serializer):
    message = serializers.CharField(max_length=256)

次に、次のことができます。

def insta_exception_handler(exc, context):
    ...
    serializer = ErrorMessageSerializer(ErrorMessage("Validation error"))
    response["data"] = serializer.data
    ...
4
ozgur