1.下面是如何继承serializers.ModelSerializer,其中fields域是自己需要的数据转为json的,其中password_ok,phone_string是模型类里面没有的,所以必须以 password_ok = serializers.CharField(label=‘确认密码’,write_only=True)这种格式进行书写,才能转为json格式,但fields中’username’,‘phone’,'password’三个字段是模型类中已经定义了,因此不需要再像前面的password_ok,phone_string这两个字段再重申明,因此继承serializers.ModelSerializer类非常方便。
class UserSerializer(serializers.ModelSerializer):
"""确定需要验证的字段"""
password_ok = serializers.CharField(label='确认密码',write_only=True)
phone_string=serializers.CharField(label='短信验证码',write_only=True)
class Meta:
model = Users
fields = ('username','phone','password','password_ok','phone_string')
2.继承serializers.ModelSerializer类,必须要重写create()方法,否则会报错,
但validate()是可以校验多个属性,可以不重写,但最好写,写序列化就是为了能校验数据,因此最好也重写该validate()方法。
#校验多个属性
def validate(self,data):
"""校验用户名长度,格式校验已经在abstractuser中设置好了"""
username=data['username']
if 6 > len(username) or len(username) > 12:
raise serializers.ValidationError('用户名的长度必须在6~12位之间')
"""校验密码的长度"""
password=data['password']
if 8>len(password) or len(password) > 12:
raise serializers.ValidationError('密码长度必须在8~12位之间')
"""校验输入密码和确认密码值是否相等"""
password_ok=data['password_ok']
if password_ok != password:
raise serializers.ValidationError('密码和确认密码不相等')
"""输入的验证码是否正确和过期,已近在获取手机验证码之前验证过了"""
"""校验输入的短信验证码是否正确"""
phone_string = data['phone_string']
phone = data['phone']
# 从redis取出真正的手机验证码数据
con = get_redis_connection()
true_phone_string = con.get(phone)
if not true_phone_string:
raise serializers.ValidationError('短信验证吗失效')
if true_phone_string.decode() != phone_string:
raise serializers.ValidationError('短信验证码错误')
return data
def create(self,validated_data):
"""保存数据"""
print('#######这是进入了create函数#####')
print(validated_data)
#super(UserSerializer,self).create(validated_data)
del validated_data['password_ok']
del validated_data['phone_string']
username=validated_data['username']
password=validated_data['password']
# user=Users.objects.create_user(**validated_data)
# user=Users.objects.create(**validated_data)
# user =super().create(validated_data)
# user.set_password(validated_data['password'])
# user.save()
return validated_data
3.调用自定义的序列化器
from rest_framework.generics import CreateAPIView
from .serializers import UserSerializer
class UserView(CreateAPIView):
serializer_class = UserSerializer