一 序列化组件之请求数据校验和保存功能
组件
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
name = serializers.CharField(min_length=2, error_messages={'required': '该字段必填'})
authors = serializers.CharField(required=False)
views
class Books(APIView):
def get(self, request, *args, **kwargs):
ret = models.Book.objects.all()
# 生成一个序列化的对象,传参数
# 序列化多条,记住many=True
book_ser = BookSerializer(ret, many=True, context={'request': request})
print(book_ser.data)
return JsonResponse(book_ser.data, safe=False)
def post(self, request, *args, **kwargs):
# 前端传递过来的数据从data中取
# 用序列化类的数据校验
# data参数,是要校验的数据
response = {'status': 100, 'msg': '成功'}
ser = BookSerializer(data=request.data)
if ser.is_valid():
# 如果数据校验通过,is_valid是True
# 保存到数据库,ser是谁的对象?继承了ModelSerializer的类的对象
ser.save()
else:
response['status'] = 101
response['msg'] = ser.errors
return JsonResponse(response, safe=False)
局部钩子与全局钩子
# 局部钩子:
def validate_name(self, value):
# print(value)
if value.startswith('sb'):
# 不能以sb开头
raise ValidationError('不能以sb开头')
else:
return value
# 全局钩子找到了
def validate(self, value):
# value是所有校验通过数据的字典
print(value)
name = value.get('name')
price = value.get('price')
if name and price:
if str(name) == str(price):
return value
else:
raise ValidationError('名字跟价格不相等')
return value
全局钩子与局部钩子校验
class BookDetail(APIView):
def get(self,request,pk):
response={'status':100,'msg':'成功'}
ret = models.Book.objects.filter(nid=pk).first()
if ret:
book_ser = BooksSerializer(ret,many=False)
response['data']=book_ser.data
else:
response['status']=101
response['msg']='您查询的对象不存在'
return JsonResponse(response,safe=False)
def put(self,request,pk):
response={'status':100,'msg':'成功'}
ret = models.Book.objects.all().filter(pk=pk).first()
if ret:
ret_ser = BooksSerializer(data=request.data,instance=ret)
if ret_ser.is_valid():
ret_ser.save()
else:
response['status']=101
response['msg']=ret_ser.errors
else:
response['status']=102
response['msg']='您访问的对象不存在'
return JsonResponse(response,safe=False)
前台错误数据
钩子校验