Django serializer.is_valid() вызывает другой пользовательский метод сериализатора

У меня есть тестовый сервер django. Я хочу размещать данные пользователя и возвращать ответ с 'username' и 'Token' после успешной регистрации.

В следующем представлении я также проверяю, существует ли request.data['email'] уже в модели Users, потому что я хочу, чтобы она вела себя как unique=True, и это дает мне неожиданные результаты.

Я знаю, что этот код - просто реализация для новичков, и это меня пока не беспокоит, но для меня важнее понять, ПОЧЕМУ мой код дает такие результаты. Я думаю, что подробный ответ поможет мне понять python намного лучше.

Вот функция View внутри файла views.py :

@api_view(['POST'])
@permission_classes((AllowAny,))
def Register(request):
    r={"username": "JohnDoeyy", "password": "Thisisapassword60!", "email": "test@test.com", "age": "50"}
    #r = request.data

    if not (r.get("username") and r.get("password") and r.get("email")):
        return Response("empty fields")
    serializer = UserSerializer(data=r)
    print("debug1")

    if request.method == 'POST':
        print("debug2")
        if serializer.is_valid() and serializer.validate_email(r.get("email")): #User.objects.filter(email=r.get("email")).exists():
            print("is_valid:", serializer.is_valid())
            try:
                print("debug3 before .save")
                serializer.save()  #This does NOT work.
                print("debug3 after .save")

                token, created = Token.objects.get_or_create(user=serializer.instance)
                return Response({"user": serializer.validated_data['username'], "token": token.key}, status=status.HTTP_200_OK)
            except Exception as e:
                print("debugException" , e)

                return Response(str(e))
        else:
            print("3")
            return Response("fail")

Вот файл serializer.py . Возможный виновник метод validate_email.

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True)

    def create(self, validated_data):
        user = UserModel.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            email=validated_data['email'],
        )
        
        return user

    def validate_email(self,givenEmail=str)->bool:
        print("debug validate email1")
        if User.objects.filter(email=givenEmail).exists():
            print("debug validate emailfalse")
            return False
        print("debug validate email - true")
        return True

    class Meta:
        model = UserModel
        # Tuple of serialized model fields (see link [2])
        fields = ['id', 'username', 'password', 'email', 'first_name']
        write_only_fields = ('password',)
        read_only_fields = ('id',)

ВЫВОД:

debug1
debug2
debug validate email1
debug validate email - true
debug validate email1
debug validate email - true
is_valid: True
debug3 before .save
debugException ***'bool' object has no attribute 'strip'***

[11/Feb/2022 15:07:58] "POST /Register/ HTTP/1.1" 200 40

Ответ сервера клиенту: "'bool' объект не имеет атрибута 'strip'"

Похоже, что validate_email() вызывается каждый раз, когда я выполняю .is_valid() и .save(), и это все портит?

Вернуться на верх