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(), и это все портит?