Не работает метод 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 can
t 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()