Не работает метод create для serializers.ModelSerializer
I study Django Rest Framework. First I created CustomUser Model based on AbstractUser. After I created serializer RegistrationSerializer based on ModelSerializer. In RegistrationSerializer I wrote my own create() for password2 validation using official specification. Extra field for password2 works well. But my RegistrationSerializer "doesn't use" my create(). Looks like it doesnt know about method and I cant understand why. On my POST request without password2 I recieve password2 is required. On my POST request with password2 I recieve CustomUser() got an unexpected keyword argument 'password2'.
accounts/models.py
class CustomUser(AbstractUser):
image = models.ImageField(verbose_name="Аватар", upload_to="covers/", null=True)
И
accounts / api / serialers.py
from rest_framework import serializers
from accounts.models import CustomUser
class RegistrationSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)
class Meta:
model = CustomUser
fields = ['email', 'username', 'password', 'password2']
extra_kwargs = {
'password': {'write_only': True},
}
def create(self):
account = CustomUser(
email=self.validated_data['email'],
username=self.validated_data['username']
)
password = self.validated_data['password']
password2 = self.validated_data['password2']
if password != password2:
raise serializers.ValidationError({'password': 'Passwords must match.'})
account.set_password(password)
account.save()
return account
Возможно, вы неправильно сделали отступ create, попробуйте так:
class RegistrationSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)
class Meta:
model = CustomUser
fields = ['email', 'username', 'password', 'password2']
extra_kwargs = {
'password': {'write_only': True},
}
def create(self, validated_data):
account = CustomUser(
email=validated_data['email'],
username=validated_data['username']
)
password = validated_data['password']
password2 = validated_data['password2']
if password != password2:
raise serializers.ValidationError({'password': 'Passwords must match.'})
account.set_password(password)
account.save()
return account
Когда вы хотите создать экземпляр CustomUser, вы можете написать:
serializer = RegistrationSerializer(data={'email': 'example@gmail.com', 'username': 'example', 'password': 'Password0', 'password2': 'Password0'})
serializer.is_valid(raise_exception=True)
serializer.save()