user.save () не работает должным образом при использовании для переопределения метода save () класса сериализатора - PullRequest
0 голосов
/ 18 июня 2020

я хотел отправить почтовый запрос с телом, содержащим адрес электронной почты, имя пользователя, пароль и пароль 2.

класс сериализатора имеет метод сохранения, который был переопределен, чтобы он проверял, что пароль1 равен паролю2 или не . если равно, я хотел, чтобы объект пользователя был создан с именем пользователя электронной почты и паролем. и хотел, чтобы его спасли. Я использую модель пользователя django.

error: TypeError: Получил TypeError при вызове User.objects.create(). Это может быть связано с тем, что у вас есть доступное для записи поле в классе сериализатора, которое не является допустимым аргументом для User.objects.create(). Возможно, вам потребуется сделать поле доступным только для чтения или переопределить метод RegistrationSerializer.create () для правильной обработки.

Класс сериализатора:

class RegistrationSerializer(serializers.ModelSerializer):
    password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)

    class Meta:
        model = User
        fields = ['email', 'username', 'password','password2']
        extra_kwargs = {'password': {'write_only': True}}

        # override one of its method to check if passwords match

        def save(self):
            user = User()
            #cant create user py passing into constructor
            user.email=self.validated_data['email']
            user.username=self.validated_data['username']
            password=self.validated_data['password']
            password2=self.validated_data['password2']
            if password!=password2:
                raise serializers.ValidationError({'password':'password must match'})
            user.set_password(password)
            user.save()
            return user

представление с именем:


@api_view(['POST', ])
def registration_view(request):
    serializer=RegistrationSerializer(data=request.data)

    data={}
    if serializer.is_valid():
        user=serializer.save()
        data['response']="successfully created"
        data['email']=user.email
        data['username']=user.username
    else:
        data=serializer.errors
    return Response(data)

1 Ответ

0 голосов
/ 18 июня 2020

Поскольку метод сохранения не является подходящим местом для проверки, вы должны использовать функцию проверки, если вы хотите, чтобы некоторые поля были правильными.

class RegistrationSerializer(serializers.ModelSerializer):
    password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)

    class Meta:
        model = User
        fields = ['email', 'username', 'password','password2']
        extra_kwargs = {'password': {'write_only': True}}


    def validate(self, attrs):
        if attrs.get('password') != attrs.get('password2'):
            raise serializers.ValidationError({'password':'password must match'})
        return attrs

    def create(self, validated_data):
        password2 = validated_data.pop('password2')
        return super().create(validated_data)

Если хотите, сохраните внешний вид http://www.cdrf.co/3.9/rest_framework.serializers/ModelSerializer.html#save

...