【Django drf】序列化器总结
序列化器字段
序列化中的字段可以根据用途分为三种:
-
既用于序列化,也用于反序列化
普通字段 -
只用于序列化 (读) (read_only)
外键字段 -
只用于反序列化 (写) (write_only)
外键字段
外键字段自定义序列化
由于普通字段比较简单,以下针对外键字段进行总结:
序列化:
模型表
----> 序列化类
----> 前端
自定义序列化通常使用于外键字段,因为这些字段无法直接跟数据关联,如果在序列化器中直接填写外键字段前端会出现如下现象:
自定义序列化是为了给前端返回json格式字符串,而想要自定义序列化有两种方法:
在模型类中写方法
- 在模型类中写方法
数据库查询到数据
---> 执行模型类中方法
--返回值--> 序列化类中字段
--序列化-> 前端
如果模型类中方法返回一个字典 ,在序列化类中使用DictField序列化。
如果模型类中方法返回一个列表 ,在序列化类中使用ListField序列化。
在序列化类中写方法
- 在序列化类中写方法,配合SerializerMethodField字段
SerializerMethodField:
这是一个只读字段。
它通过调用附加到的序列化程序类上的方法来获取其值。
它可用于将任何类型的数据添加到对象的序列化表示中。
数据库查询到数据
---> 执行SerializerMethodField()
---> 执行序列化类中方法
--返回值--> json.dumps
--序列化-> 前端
反序列化
模型表
<---- 序列化类
<---- 前端
外键字段反序列化保存
模型表
<-- 序列化类中create、updata等方法-- 序列化类中字段
<--主键-- 前端
ModelSerializer使用总结
# 如何使用
1 定义一个类继承ModelSerializer
2 类内部写内部内 class Meta:
3 在内部类中指定model
填写要序列化的表
4 在内部类中指定fields
写要序列化的字段,写__all__表示所有,__all__不包含方法,如果要包含方法必须要在列表中写一个个字段。
示例:['字段1','字段2'...]
5 在内部类中指定extra_kwargs,给字段添加字段参数的
因为有些字段是从模型类映射过来的,在序列化类中没有这个字段,所以需要使用extra_kwargs添加字段参数。
6 在序列化类中,可以重写某个字段,优先使用你重写的
name = serializers.SerializerMethodField()
def get_name(self, obj):
return 'sb---' + obj.name
7 以后不需要重写create和update了
-ModelSerializer写好了,兼容性更好,任意表都可以直接存(考虑了外键关联)
-当有特殊需求的情况下,也可以重写
# 在modelserialzer中写其他模型表字段
此时需要在modelserialzer类中重写create方法,因为modelserialzer内部的create只会对序列化类中指定的模型类进行操作,而不会对指定之外的类进行操作。