【Django drf】序列化器总结

序列化器字段

序列化中的字段可以根据用途分为三种:

  1. 既用于序列化,也用于反序列化
    普通字段

  2. 只用于序列化 (读) (read_only)
    外键字段

  3. 只用于反序列化 (写) (write_only)
    外键字段

image-20230202195740169

外键字段自定义序列化

由于普通字段比较简单,以下针对外键字段进行总结:

序列化:

模型表 ----> 序列化类 ----> 前端

自定义序列化通常使用于外键字段,因为这些字段无法直接跟数据关联,如果在序列化器中直接填写外键字段前端会出现如下现象:

image

自定义序列化是为了给前端返回json格式字符串,而想要自定义序列化有两种方法:

在模型类中写方法

  1. 在模型类中写方法

数据库查询到数据 ---> 执行模型类中方法 --返回值--> 序列化类中字段 --序列化-> 前端

​ 如果模型类中方法返回一个字典 ,在序列化类中使用DictField序列化。
​ 如果模型类中方法返回一个列表 ,在序列化类中使用ListField序列化。

image-20230202194318403

在序列化类中写方法

  1. 在序列化类中写方法,配合SerializerMethodField字段

SerializerMethodField:
这是一个只读字段。
它通过调用附加到的序列化程序类上的方法来获取其值。
它可用于将任何类型的数据添加到对象的序列化表示中。

数据库查询到数据 ---> 执行SerializerMethodField() ---> 执行序列化类中方法 --返回值--> json.dumps --序列化-> 前端

image-20230202194652536

反序列化

模型表 <---- 序列化类 <---- 前端

外键字段反序列化保存

模型表 <-- 序列化类中create、updata等方法-- 序列化类中字段 <--主键-- 前端

image-20230202205141921

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只会对序列化类中指定的模型类进行操作,而不会对指定之外的类进行操作。

posted @ 2023-02-02 21:17  passion2021  阅读(174)  评论(0编辑  收藏  举报