model
# DRF模型序列化验证
class User(models.Model):
GENDERS = (
(1,'男'),(2,'女')
)
name = models.CharField(max_length=10,verbose_name='名字')
phone = models.CharField(max_length=11,verbose_name='手机号')
gender = models.IntegerField(choices=GENDERS,verbose_name='性别')
pwd = models.CharField(verbose_name='密码',max_length=64)
序列化
# DRF 模型序列化验证
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
视图
# 验证
@csrf_exempt
def user_list(request):
if request.method == 'GET':
users = User.objects.all()
serializer = UserSerializer(users,many=True,context={'request':request})
return JsonResponse(serializer.data)
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = UserSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse({'data':serializer.data,'status':201})
return JsonResponse({'data': serializer.errors, 'status': 400})
@csrf_exempt
def user_detail(request, id):
try:
user = User.objects.get(id=id)
except User.DoesNotExist:
return HttpResponse(status=404)
if request.method == 'GET':
serializer = UserSerializer(user)
return JsonResponse(serializer.data)
elif request.method == 'PUT':
data = JSONParser().parse(request)
serializer = UserSerializer(user, data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse({'data':serializer.data,'status':201})
return JSONResponse(serializer.errors, status=400)
elif request.method == 'DELETE':
user.delete()
return HttpResponse(status=204)
url
path('users/', views.user_list, name='user_list'), # 获取或创建
path('users/<int:id>/', views.user_detail, name='user-detail'), # 查找、更新、删除
这里手机没有做约束
序列化中做单独约束
# DRF 模型序列化验证
class UserSerializer(serializers.ModelSerializer):
# 手机号 最多11 最少11 必填
phone = serializers.CharField(max_length=11,min_length=11,required=True)
pwd1 = serializers.CharField(write_only=True)
class Meta:
model = User
fields = '__all__'
# 单独验证
def validate_phone(self,phone):
if not re.match(r'1[3456789]\d{9}',phone):
raise serializers.ValidationError('手机号不合法')
if User.objects.filter(phone=phone).all():
raise serializers.ValidationError("手机号已被注册")
return phone # 一定要有返回值
# 多数据验证
def validate(self, attrs):
if attrs.get('pwd2') != attrs.get('pwd'):
raise serializers.ValidationError("两次密码不一样")
attrs.pop('pwd1') # 验证后 pop掉
return attrs