Ситуация
Я создаю простую конечную точку, которая позволяет создавать пользователя. Мне нужно поле, которое отсутствует в моей пользовательской модели (т.е. confirm_password
). Я проведу проверку, которая сравнивает это поле и другое поле, которое находится в моей модели, и никогда больше не используйте дополнительное поле в сериализаторе.
Проблема
Версия 3 DRF изменила процесс выполнения этого, и я не совсем понимаю, что предлагает документация. См. здесь для документации.
Попытка решения
Я создал UserSerializer
, который выглядит так:
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']
Я надеялся, что popping confirm_password
в validate
позаботится о моих проблемах, но я просто получаю следующее:
Получите
KeyError
при попытке получить значение для поляconfirm_password
в serializerUserSerializer
. Поле сериализатора может быть названо неправильно и не соответствует никакому атрибуту или ключу в экземпляреOrderedDict