Не работает метод 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()
Вернуться на верх