2017-04-26 2 views
0

Ich möchte ein Passwort auf der Serverseite erstellen und es an den Benutzer zurücksenden. Unten ist der Code, den ich geschrieben habe:Zugriff auf ein SerializerMethodField in create()

class ASCreateSerializer(serializers.Serializer): 
    name = serializers.CharField(write_only = True) 
    password = serializers.SerializerMethodField() 

    def get_password(self, obj): 
     from django.utils.crypto import get_random_string 
     password = get_random_string(length=16) 
     return password 

    def create(self, validated_data): 
     name = validated_data['name'] 
     as = AS.objects.get_or_create(name = name, 
        password = validated_data['password'] 
       ) 

Ich bekomme einen Schlüsselfehler für "Passwort". Wie kann ich auf den Wert SerializerMethodField in create() zugreifen?

+0

Sie sind sicher, ob Kennwortschlüssel auf validate_date ist ?, überprüfen auch, ob Schlüssel exist –

+0

@juliansalas Anscheinend ist es nicht und damit der Fehler. Die Frage ist, wie sonst kann ich dann auf den Wert dieses (Passwort-) Feldes zugreifen? – toothie

+1

Haben Sie 'self.get_password()' versucht? 'SerializerMethodField' ist ein schreibgeschütztes Feld. –

Antwort

0

SerializerMethodField (Doc) ist ein schreibgeschütztes Feld. Dieses Feld wird verwendet, wenn Sie das Feld für ein bestimmtes Objekt berechnen wollen und somit nicht notwendig sind, wenn Sie die Eingabe erhalten (Schreibfall). In diesem Fall können Sie ein Passwort innerhalb der create-Methode erzeugen und haben nur name im Serializer.

+0

benutze Aber in meinem Fall möchte ich dieses Feld nach einer erfolgreichen Anfrage zurückgeben. – toothie

0

Sie können auf die get_password() Methode zugreifen, indem Sie self.get_password() als @Andrey Shipilov erwähnt. Aber entfernen Sie das unnötige zweite Argument obj aus der Definition von get_password().

Wenn das, was Sie benötigen ist ein zufälliges Passwort zur Datenbank speichern und in Antwort zurückgeben, sollten Sie etwas zu tun, wie:

def create_password(): 
    from django.utils.crypto import get_random_string 
    password = get_random_string(length=16) 
    return password 

class ASCreateSerializer(serializers.Serializer): 
    name = serializers.CharField(write_only = True) 
    password = serializers.CharField() 

    def create(self, validated_data): 
     name = validated_data['name'] 
     as = AS.objects.get_or_create(
       name = name, 
       password = create_password() 
      ) 
+1

Ich erhalte diesen Fehler: AttributeError at/device/as/ 'ASCreateSerializer' Objekt hat kein Attribut 'Passwort', wenn ich versuche, auf self.password zuzugreifen – toothie

+0

@toothie Ich habe meine Antwort bearbeitet – akhilsp

Verwandte Themen