django反序列化
Django REST framework中序列化器需继承rest_framework.serializers.Serializer,序列化器的作用为校验数据和对数据对象进行转换
1.数据校验
(1)序列化器
class BookInfoSerializer(serializers.Serializer):
id=serializers.IntegerField(label='ID',read_only=True)
btitle=serializers.CharField(label='书名',max_length=20)
bpub_date=serializers.DateField(label='发行日期',required=False)
bread=serializers.IntegerField(label='阅读量',required=False)
bcomment=serializers.IntegerField(label='评论量',required=False)
image=serializers.ImageField(label='封面',required=False)
# 可以在序列化时校验输入,validate_btitle校验单一字段btitle
def validate_btitle(self,value):
# 比如校验书名必须包含“小说”
if "小说" not in value.lower():
raise serializers.ValidationError("不叫小说!")
return value
# 校验全局字段
def validate(self,value):
return value
(2)效果
2.create和update方法
class BookInfoSerializer(serializers.Serializer):
id=serializers.IntegerField(label='ID',read_only=True)
btitle=serializers.CharField(label='书名',max_length=20)
bpub_date=serializers.DateField(label='发行日期',required=False)
bread=serializers.IntegerField(label='阅读量',required=False)
bcomment=serializers.IntegerField(label='评论量',required=False)
image=serializers.ImageField(label='封面',required=False)
def update(self, instance, validated_data):
# 更新数据,比如只改标题和阅读量
instance.btitle=validated_data.get("btitle",instance.btitle)
instance.bread=validated_data.get("bread",instance.bread)
instance.save() # 这里要和序列化对象一起保存,才能最终commit到数据库
return instance
def create(self, validated_data):
return BookInfo.objects.create(**validated_data)
效果