2017-05-12 5 views
2

Ich habe die folgenden benutzerdefinierten Ausnahme-Handler in Django REST-Framework.Django Rest Framework-Antwort ist nicht JSON Serialisierung Fehler

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) 

Ich möchte ein JSON Ausgabe wie unten

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

Aber ich habe den Fehler TypeError: Object of type 'ErrorMessage' is not JSON serializable. Warum ist eine Klasse so einfach wie ErrorMessage über nicht JSON serialisierbar? Wie kann ich dieses Problem lösen?

+0

Sie ordnen 'ErrorMessage' dem' response ['data'] '' zu. Klassenobjekte können nicht magisch zu python dict wechseln. Überprüfen Sie diesen Link: http://stackoverflow.com/questions/61517/python-dictionary-from-an-objects-fields Zum Konvertieren von Python-Klassenobjekte in dict. –

Antwort

1

Es ist nicht serialisierbar, weil es ein object ist, es sollte dict, list oder einfacher Wert sein. Aber Sie können leicht Ihr Problem beheben, indem Sie magische Eigenschaft mit __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

Ich denke, allgemeinere Art und Weise einen Serializer für die Serialisierung die Fehlermeldung Objekt zu erstellen wäre:

from rest_framework import serializers 

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

Dann können Sie tun:

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