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

  

 

posted @ 2022-08-28 15:40  Yuan_x  阅读(26)  评论(0编辑  收藏  举报