DRF模型序列化验证

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值