SituationZusätzliche Serializer Felder in Django REST-Framework 3
ich einen einfachen Endpunkt bin schaffen, die für die Erstellung eines Benutzers ermöglicht. Ich brauche ein Feld, das nicht in meinem Benutzermodell ist (d. H. confirm_password
). Ich werde Validierung ausführen, die dieses Feld mit einem anderen Feld vergleicht, das sich in meinem Modell befindet, und das zusätzliche Feld nie wieder in dem Serialisierungsprogramm verwenden.
Problem
DRF Version 3 hat den Prozess verändert dies zu erreichen, und ich verstehe nicht ganz, was die Dokumentation schlägt vor, ich tun. Die Dokumentation finden Sie unter here.
Versuch Lösung
ich eine UserSerializer
erstellt haben, die wie folgt aussieht:
from django.contrib.auth import get_user_model
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
confirm_password = serializers.CharField(allow_blank=False)
def validate(self, data):
"""
Checks to be sure that the received password and confirm_password
fields are exactly the same
"""
if data['password'] != data.pop('confirm_password'):
raise serializers.ValidationError("Passwords do not match")
return data
def create(self, validated_data):
"""
Creates the user if validation succeeds
"""
password = validated_data.pop('password', None)
user = self.Meta.model(**validated_data)
user.set_password(password)
user.save()
return user
class Meta:
# returns the proper auth model
model = get_user_model()
# fields that will be deserialized
fields = ['password', 'confirm_password',
'username', 'first_name', 'last_name', 'email']
# fields that will be serialized only
read_only_fields = ['is_staff', 'is_superuser']
# fields that will be deserialized only
write_only_fields = ['password' 'confirm_password']
Ich hatte gehofft, dass confirm_password
in validate
popping meiner Probleme kümmern würde, aber ich habe nur die folgende:
Erhalten
KeyError
beim Versuch, ein zu erhalten Wert für das Feldconfirm_password
am SerializerUserSerializer
. Der Serializer Feld könnte falsch und nicht überein jedes Attribut oder Taste auf der
Nur ein Heads-up, ist es üblich, für die meisten Menschen die setzen Meta-Klasse an der Spitze des Serialisierers, da sie die meisten Informationen enthält, nach denen Sie normalerweise suchen. –
Ah, das würde Sinn machen. Ich schätze es! – nmagerko