序列化类的字段类型
记不住, 有很多,不需要都记住 只需要记住:CharField,IntegerField,DateField。。 View.py中
class BookView(APIView):
def get(self, request, pk):
response_msg = {'code': 1000, 'msg': '成功'}
book = models.Book.objects.filter(id=pk).first()
book_ser = BookSerializer(book)
response_msg['data'] = book_ser.data
return Response(response_msg)
View.py中
def get(self, request, pk):
response_msg = {'code': 1000, 'msg': '成功'}
book = models.Book.objects.filter(id=pk).first()
book_ser = BookSerializer(book)
response_msg['data'] = book_ser.data
return Response(response_msg)
def put(self, request, pk):
response_msg = {'code': 1000, 'msg': '成功'}
book = models.Book.objects.filter(id=pk).first()
book_ser = BookSerializer(book, request.data)
if book_ser.is_valid():
book_ser.save()
response_msg['data'] = book_ser.data
return Response(response_msg)
else:
response_msg['code'] = 1001
response_msg['msg'] = '数据校验失败'
response_msg['data'] = book_ser.errors
这里put方法会报错,因为必须重写父类的update方法
class BookSerializer(serializers.Serializer):
id = serializers.CharField()
name = serializers.CharField()
price = serializers.CharField()
author = serializers.CharField()
publish = serializers.CharField()
def update(self, instance, validated_data):
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
instance.author = validated_data.get('author')
instance.publish = validated_data.get('publish')
instance.save()
return instance
序列化字段选项
是里边参数
class BookSerializer(serializers.Serializer):
id = serializers.CharField(max_length=8)
序列化组件修改数据
1 写一个序列化的类,继承Serializer
2 在类中写要反序列化的字段,想反序列化哪个字段,就在类中写哪个字段,字段的属性(max_lenth......)
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值
3 在视图类中使用,导入--》实例化得到序列化类的对象,把要要修改的对象传入,修改的数据传入
boo_ser=BookSerializer(book,request.data)
boo_ser=BookSerializer(instance=book,data=request.data)
4 数据校验 if boo_ser.is_valid()
5 如果校验通过,就保存
boo_ser.save()
6 如果不通过,逻辑自己写
7 如果字段的校验规则不够,可以写钩子函数(局部和全局)
def validate_price(self, data):
if float(data)>10:
return data
else:
raise ValidationError('价格太低')
def validate(self, validate_data):
print(validate_data)
author=validate_data.get('author')
publish=validate_data.get('publish')
if author == publish:
raise ValidationError('作者名字跟出版社一样')
else:
return validate_data
8 可以使用字段的author=serializers.CharField(validators=[check_author]) ,来校验
-写一个函数
def check_author(data):
if data.startswith('sb'):
raise ValidationError('作者名字不能以sb开头')
else:
return data
-配置:validators=[check_author]
|