逻辑导航
1.先写一个序列化类,该类中返回需要序列化的字段和反序列化的字段
2.只序列化的字段采用read_only,只反序列化的用write_only
3.序列化类继承模型序列化器,但是需要重写模型序列化器的create方法
4.定义一个全局钩子,校验电话和验证码
代码实现
serializes.py
class RegisterSerialize(serializers.ModelSerializer):
code = serializers.CharField(max_length=4,min_length=4,write_only=True)
class Meta:
model = models.UserInfo
fields = ['username','code','telephone','password']
extra_kwargs = {
'username':{'read_only':True},
'password':{'max_length':16,'min_length':6}
}
def validate(self, attrs):
telephone = attrs.get('telephone')
code = attrs.get('code')
cache_code = cache.get(settings.CACHE_MSG % telephone)
if re.match('^1[3-9][0-9]{9}$',telephone):
if code == cache_code:
attrs['username'] = telephone # 把用户的手机号设置成用户名,不然数据库没有用户的用户名
attrs.pop('code')
return attrs
else:
raise ValidationError('验证码不正确')
else:
raise ValidationError('手机号不合法')
# 模型类序列化器由于内部封装好了create和update方法,原本是不需要我们写的,但是code反序列化字段表中没有,
# 所以,不重写会报错,需要我们自己重写一下
def create(self, validated_data):
user = models.UserInfo.objects.create_user(**validated_data)
return user
views.py
class RegisterView(GenericViewSet,CreateModelMixin):
queryset = models.UserInfo.objects.all()
serializer_class = serializers.RegisterSerialize
def create(self, request, *args, **kwargs):
response = super().create(request, *args, **kwargs)
username = response.data.get('username')
return APIResponse(msg='注册成功',username=username)
urls.py
router.register('register',views.RegisterView,'reg')
标签:username,code,create,telephone,接口,attrs,注册,序列化,搭建
From: https://www.cnblogs.com/suncolor/p/16856800.html