Django REST framework中的Serializer使用类来定义,要继承rest_framework.serializers.Serializer
。
-如果想序列化和反序列化都用一个序列化类,可以使用如下俩字段控制
-read_only 表明该字段仅用于序列化输出,默认False(重点)
-write_only 表明该字段仅用于反序列化输入,默认False(重点)
-如果写起来比较麻烦,可以使用两个序列化类,一个序列化,一个反序列化
# source的用法
name1 = serializers.CharField(source='name')--->意思是name1映射成models中的name
# 如果继承Serializer类,要修改和保存,一定要重写update和create
BookSerializer---》Serializer---》BaseSerializer--save的核心代码
if self.instance is not None:
self.instance = self.update(self.instance, validated_data)
else:
self.instance = self.create(validated_data)
序列化类之ModelSerializer(*****
)
from .models import Book, Publish
# class PublishModelSerializer(serializers.ModelSerializer):
# # 指定跟表的对应关系
# class Meta:
# model = Publish # 跟哪个表有关系
# # fields =['name','addr']
# # fields ='__all__' # 所有字段,只序列化字段,不序列化方法
# fields = ['name', 'addr', 'name_detail']
# # 给字段类,传递参数、属性
# extra_kwargs={
# 'addr':{'max_length':8,'min_length':3,'write_only':True},
# # 'name':{'write_only':True}
# }
# # 不重要的
# # exclude=['name'] # 它跟fields 只能由一个
# # depth=1
#
#
# #1 不用重写create和update
#
# #2 在出版社名字后加 _vip
# # 方式一
# # name=serializers.SerializerMethodField()
# # def get_name(self,obj):
# # return obj.name+'_vip'
#
# # 方式二,在表模型中定义一个name_detail,在fields中写一些字段或方法
#
# ## 序列化的时候使用name_detail,反序列化的时候使用name
# # name_detail = serializers.CharField(read_only=True) 如果是个方法,这句可以不写
# name = serializers.CharField(write_only=True)
#
#
#
# #3 限制addr,最大长度8,最小长度3
序列化类全局,
# 局部钩子:给某个字段再增加校验(固定用法),定义一个方法,名字为validate_字段名
def validate_addr(self, item):
if item.startswith('sb'):
# 抛异常,不能以sb开头
raise ValidationError('不能以sb开头')
else:
return item
# 全局钩子
# 限制出版社的名字不能等于出版社地址
def validate(self, attrs):
name = attrs.get('name')
addr = attrs.get('addr')
if name == addr:
raise ValidationError('name和addr不能一样')
else:
return attrs
局部钩子(*****
)
可以讨论