2016-05-27 11 views
2

Ich habe einen Serializer wie folgt aus:Django Ruhe Rahmen Wie aktualisieren SerializerMethodField

class PersonSerializer(serializers.ModelSerializer): 
    gender = serializers.SerializerMethodField() 
    bio = BioSerializer() 

    class Meta: 
     model = Person 
     fields = UserSerializer.Meta.fields + ('gender', 'bio',) 

    def get_gender(self, obj): 
     return obj.get_gender_display() 

ich verwendet, um dieses „männlich“ und „weiblich“ anzuzeigen (insted von „M“ von „F“) während der Durchführung GET anfordern.

Das funktioniert gut.

Aber jetzt schreibe ich eine Patch-Methode für das Modell und SerializerMethodField() hat read_only=True. So bekomme ich keinen Wert für Geschlecht Feld in serializer.validated_data() übergeben. Wie überwinde ich dieses Problem?

Antwort

8

Wenn ich Sie also richtig verstehe, möchten Sie {'gender': 'Male'} in Ihre PATCH-Anfrage senden.

Daher müssen Sie Ihrem Serializer mitteilen, wie Sie Ihre Repräsentation, d. H. "Male", in den internen Wert konvertieren.

Wie Sie see in source können, deckt SerializerMethodField nur die Konvertierung von internen Wert in die Darstellung.

Sie können ein benutzerdefiniertes SerializerField implementieren, das die erforderlichen Konvertierungen durchführt. Eine naive Implementierung könnte so etwas wie folgt aus:

class GenderSerializer(serializers.Field): 

    VALUE_MAP = { 
     'M': 'Male', 
     'F': 'Female' 
    } 

    def to_representation(self, obj): 
     return self.VALUE_MAP[obj]    

    def to_internal_value(self, data): 
     return {k:v for v,k in self.VALUE_MAP.items()}[data] 

class PersonSerializer(serializers.ModelSerializer): 
    gender = GenderSerializer() 
    ... 

Beachten Sie, dass diese nicht getestet und jede Validierung fehlt, überprüfen Sie die DRF docs on custom fields aus.

+0

Ich tat, wie Sie sagten, aber es funktioniert nicht. Serializer erkennt in diesem Fall auch keine Taste mit dem Namen "Gender". btw serializers.Serializer in der Klasse params wie gesagt Serailizer haben kein Feld wie SerializerField – Kishan

+0

Sorry, die Basisklasse war falsch (ich nehme an, das ist, was Sie mit "Klasse params"). Es sollte 'serializers.Field' anstelle von' serializer.SerializerField' sein. –

+0

ja korrekt Danke für den Hilfe-Mann.! – Kishan

Verwandte Themen