Django Rest Framework Response is not JSON serializable error

I have the following custom exception handler in Django REST framework.

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)

      

I need JSON output as shown below

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

      

But I am getting error TypeError: Object of type 'ErrorMessage' is not JSON serializable

. Why is the class as simple as ErrorMessage

above and not JSON serializable? How can I solve this problem?

+3


source to share


2 answers


It is not serializable because it is object

, it should be dict

, list

or a simple value. But you can easily fix your problem using the magic property__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)

      

+2


source


I think a more general way would be to create a serializer to serialize the error message object:

from rest_framework import serializers

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

      



Then you can do:

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

      

+2


source







All Articles