关于django—模型序列化器类详细内容(补充)

一、定义模型序列化器类

1、继承serializers.ModelSerializer类或其子类
在这里插入图片描述
2、需要在Meta内部类中指定model、fields类属性参数
3、model指定模型类(需要生成序列化器的模型类)
4、fields指定模型类中哪些字段需要自动生成序列化器字段
1)、如果指定为__all__,那么模型类中所有的字段需要自动转化为序列化器字段
2)、如果将特定的字段转化为序列化器字段,用元组表示

fields=(‘id’,‘name’,‘leader’,‘interfaces_set’,‘token’)
3)、exclude指定模型类中哪些字段不需要设置为序列化器字段,其他的字段需要转化
exclude=(‘create_time’,‘update_time’)
关于django—模型序列化器类详细内容(补充)_第1张图片
5、会给id主键、有指定auto_new或者auto_add_now参数DateTimeField字段,添加read_only=True
6、有设置unique=True的模型字段,会自动在validators列表中添加唯一约束校验UniqueValidator
7、如果有设置default=True的模型字段,会自动添加required=True
8、有设置null=True的模型字段,会自动添加allow=True
9、有设置blank=True的模型字段,会自动添加allow_blank=True
关于django—模型序列化器类详细内容(补充)_第2张图片

二、修改自动生成的序列化器字段

方式一:
a、可以重新定义模型类中同名的字段
b、自定义字段的优先级会更高(会覆盖自动生成的序列化器字段)
c、fields元组中必须指定进行序列化或者反序列化操作的所有字段名称。指定了’all’和exclude除外
方式二
a、如果自动生成的序列化器字段,只有少量不满足要求,可以在Meta中extra_kwargs字典进行微调
b、将需要调整的字段作为key,把具体需要修改的内容作为value

例如:
关于django—模型序列化器类详细内容(补充)_第3张图片
c、可以将需要批量设置read_only参数的字段名添加到Meta中的read_only_fields元组
read_only_fields=(‘leader’,‘is_execute’,‘id’)

三、视图中运用模型序列化器类

1、导入ProjectModelSerializer
关于django—模型序列化器类详细内容(补充)_第4张图片
2、创建数据时,报错误
raise TypeError(“%s() got an unexpected keyword argument ‘%s’” % (cls.name, kwarg))
TypeError: Projects() got an unexpected keyword argument ‘myname’
在这里插入图片描述

原因:当save()方法中传递有参数时,校验通过后会将myname参数添加到validated_data字典中,当调用save方法后,会执行create方法创建数据,但是模型类中没有myname字段,所以报错,要把这myname个参数删掉,才能创建数据;
怎么做???
当前端传入的数据检验通过后需要在模型序列化器类中将myname字段删除,模型序列化器类中提供了create方法,但是父类提供的create方法不满足要求,需要重写create方法。
重写的内容为:validated_data.pop(‘myname’)

关于django—模型序列化器类详细内容(补充)_第5张图片

3、继承父类的create方法
a、继承ModelSerializer之后,ModelSerializer中实现了create和update方法
b、一般无需再次定义create和update方法

c、如果父类提供的create和update方法不满足需要时,可以重写create和update方法,最后再调用父类的create和update方法

四、token的输出

当设置token=serializers.CharField(read_only=True)时,
1、说明token只输出,不需要进行输入校验,
2、当前端传入的数据传给data参数,经过is_valid()方法进行检验,校验通过之后会返回validated_data参数(一般为字典),
3、之后执行save()方法,自动执行create方法,并将validated_data参数传给create方法进行创建数据,而validated_data字典中不包含token,所以创建的模型类对象中不包含token的key,
4、创建的模型对象去和序列化模型类中的字段进行对比时,会忽略序列化模型类中的token字段,因此要在create中添加token
5、添加token一定要添加到创建模型对象之后,不然会报错

关于django—模型序列化器类详细内容(补充)_第6张图片
利用postman,发送请求
关于django—模型序列化器类详细内容(补充)_第7张图片

五、一定要注意的是:

fields指定模型类中的字段和自定义的字段中那些需要自动生成序列化器字段

token在模型类中没有定义,需要自定义token字段,如果fields中添加了token字段,而序列化器中没有定义token序列化器字段,会报错

在这里插入图片描述
关于django—模型序列化器类详细内容(补充)_第8张图片

你可能感兴趣的:(django,python,django,服务器,后端)