2016-11-11 4 views
3

Ich lese auf Django REST-Framework und ich habe ein Modell, das mit Gettern mit der SerializerMethodField() serialisiert wird.Django REST Serializer Methode beschreibbar Feld

Wenn ich jedoch POST zu diesem Endpunkt, möchte ich in der Lage sein, dieses Feld auch zu setzen, aber das funktioniert nicht, weil Sie, wie die Dokumente oben zeigen, nicht in ein SerializerMethodField schreiben können. Gibt es in Django REST eine Möglichkeit, ein Serialisierungsfeld zu haben, für das Sie eine benutzerdefinierte Getter-Methode definieren, und eine benutzerdefinierte Setter-Methode?

EDIT: Hier ist die Quelle von dem, was ich versuche zu tun. Client hat eine 1: 1-Beziehung mit dem Benutzer.

class ClientSerializer(serializers.ModelSerializer): 
    email = serializers.SerializerMethodField() 

    def create(self, validated_data): 
     email = validated_data.get("email", None) # This doesn't work because email isn't passed into validated_data because it's a readonly field 
     # create the client and associated user here 


    def get_email(self, obj): 
     return obj.user.email 

    class Meta: 
     model = Client 
     fields = (
      "id", 
      "email", 
     ) 
+0

http://stackoverflow.com/questions/18396547/django-rest-framework-adding-additional-field-to-modelserializer –

+0

Ja, darum geht es mir. Es besagt, dass Sie in einem dieser Kommentare keine Daten an ein serializermethodfield auf POST wirklich akzeptieren können, aber ich frage, ob es eine Möglichkeit gibt, dies in Django REST zu tun, die möglicherweise das serializermethodfield – Nick

+1

nicht verwendet, das Sie posten sollten die Quelle für Ihre Nutzung der Django Rest Serializer-Methode. Warum nicht einfach ein normales Serializer-Feld verwenden? Sie können den Methodenserialisierer nicht für Postanforderungen verwenden, da es sich um ein schreibgeschütztes Feld handelt. – Dap

Antwort

1

Sie benötigen eine andere Art von Feld zu verwenden:

class ClientSerializer(serializers.ModelSerializer): 
    email = serializers.EmailField(source='user.email') 

    def create(self, validated_data): 
     # DRF will create object {"user": {"email": "inputed_value"}} in validated_date 
     email = validated_data.get("user", {}).get('email') 

    class Meta: 
     model = Client 
     fields = (
      "id", 
      "email", 
     ) 
0

Warum nicht einfach den Client in der Ansicht erstellen?

def post(self, request, *args, **kwargs): 
    data = { 
     'email': request.data.get('email'), 
    } 

    serializer = ClientSerializer(data=data) 
    if serializer.is_valid(): 
     email = serializer.data.get('email') 
     client = Client.objects.create(email=email) 
     # do other stuff 
+1

Ich könnte das definitiv tun, aber ich hatte gehofft, dass es einen Weg gibt, diesen Anwendungsfall in Django REST Serialisierer bereits zu behandeln. Es scheint merkwürdig, die Logik der Serialisierung und der Felder vom Serialisierer selbst zu trennen. – Nick

+0

Kann die Post-Methode eines ViewSets auch überschrieben werden? –

Verwandte Themen