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):
...