class UserRegSerializer(serializers.ModelSerializer):
# 使用系统自带校验器
code = serializers.CharField(required=True, write_only=True, max_length=4, min_length=4, label="验证码",
error_messages={ # 校验失败错误信息
"blank": "请输入验证码",
"required": "请输入验证码",
"max_length": "验证码格式错误",
"min_length": "验证码格式错误"
},
help_text='验证码')
username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
validators=[UniqueValidator(queryset=User.objects.all(), message="用户已经存在")])
password = serializers.CharField(style={'input_type': 'password'}, help_text="密码", label="密码", write_only=True)
# 对单一字段进行自定义校验
def validate_code(self, code):
verify_records = VerifyCode.objects.filter(mobile=self.initial_data["username"]).order_by("-add_time")
if verify_records:
last_record = verify_records[0]
five_minutes_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
if five_minutes_ago > last_record.add_time:
raise serializers.ValidationError("验证码过期") # 自定义校验错误信息
if last_record.code != code:
raise serializers.ValidationError("验证码错误")
else:
raise serializers.ValidationError("验证码错误")
# 对所有字段进行校验
def validate(self, attrs):
attrs["mobile"] = attrs["username"]
# attrs["password"] = make_password(attrs["password"]) # 对密码加密,方式一
del attrs["code"]
return attrs
def create(self, validated_data):
# 对密码加密,方式一
user = super(UserRegSerializer, self).create(validated_data=validated_data)
user.set_password(validated_data["password"])
user.save()
return user
class Meta:
model = User
fields = ('username', 'code', 'mobile', 'password')