Drf序列化
1、分类:
drf 序列化器其中2种较为常用 serializers.Serializer 和 serializers.ModelSerializer,ModelSerializer实际上是继承了Serializer做了部分的扩展,Serializer一般对字段操作,ModelSerializer一般对表操作,ModelSerializer自动生成了 create() 和 update()
from rest_framework.serializers import Serializer,ModelSerializer
2、使用:
正反序列化
正向序列化 ORM-->参数,返回
反向序列化 参数--->ORM,保存
2.1:Serializer
如果涉及多条数据,需要在视图中 序列化类 增加参数 many = True
class BookApiView(APIView):
def get(self,request,*args,**kwargs):
# 此时 request已经不是django原生的,是drf自己定义的,drf除了重写了额as_view 还重写了dispatch 方法 ,在dispatch中对request方法又重写了
books = Book.objects.all()
book_ser = BookModelSer(books,many=True)
return Response({"code":500,"data":book_ser.data})
def post(self,request,*args,**kwargs):
ser = BookModeSer(data=request.data)
if ser.is_vaild():
ser.save()
return Response(data=ser.data,status=200)
return Response(data=ser.errors,status=400)
ser
class BookModeSer(serializers.Serializer):
# read_only 表明该字段仅用于序列化输出 默认False 如果设置成True 则调用方能看到该字段 修改时 不需要传
# write_only 表明该字段仅用于反序列化输入 默认False 如果设置成True 则调用方在查询的时候看不该字段,修改时则该字段必须传
# 限制字段的读写 read_only 允许返回 但是变更的时候不变更这个字段也不需要传
nid = serializers.CharField(read_only=True)
name = serializers.CharField()
price = serializers.DecimalField(5,2)
book_group = serializers.SerializerMethodField(read_only=True)
def get_book_group(self,row):
object_list = row.book_group.all().values("id","group")
return object_list
def create(self,validated_data):
return Book.objects.create(**validated_data)
def update(self, instance, validated_data):
"""
:param instance: view 传入的 Book对象 即orm对象
:param validated_data:检验数据
:return:
"""
# 从检查通过的数据 从新赋值给 orm对象
instance.name = validated_data.get("name")
instance.save()
# 后续 view 可能要用
return instance
def validate_name(self, data):
"""
局部 检校钩子
:param data: serlizalier 中的name
:return:
"""
if len(data)<300:
return data
else:
raise ValidationError("{}---->长度不能超过300".format(data))
def validate(self, validate_data):
"""
全局 检校钩子
:param validate_data: 校验通过的数据
:return:
"""
validata_name = validate_data.get("name")
if "sb" in validata_name:
raise ValidationError("存在敏感字")
else:
return validate_data
2.2:ModelSerializer
class BookModelSerializer(ModelSerializer):
class Meta:
# 序列化那个表
model = Book
# 所有字段全部序列化
fields = "__all__"
# 渲染制定字段
#fields = ('name','price')
# 排除字段 fields 互斥
#exclude = ("nid",)
# 3.2 版本在之后 已经启用extra_kwargs
# read_only_fields = ('price')
# write_only_fileds = ('name')
#后续需要搭配 extra_kwargs 参数指定 不能对id 主建做限制
extra_kwargs = {
"price":{
"min_value":0,"required":True,"write_only":True
}
}
# 基本同 Serializer 一致
#局部检校钩子
def validate_price(self,value):
price = value.get("name")
if price is not None or int(price)<0:
raise ValidationError("失败")
#全局检校钩子
def validate(self,value):
...

浙公网安备 33010602011771号