6、DRF框架之serializer序列化

一、序列化与反序列化

1.序列化

概念:将程序中的一个数据结构类型转化为其它格式(字典、json、XML等)。例如:将django中的模型类对象转换为json字符串,这个转换过程称之为序列化
序列化时机:当需要给前端响应模型数据时,需要将模型数据序列化成前端需要的格式

2.反序列化

概念:将其它格式 (字典、json、XML等)转换为程序中的数据,例如:将json字符串转换为django中的模型类对象,这个过程称之为反序列化
反序列化时机:当需要将用户发送的数据存储到数据库之前,需要使用反序列化

3.开发Restful接口时

视图中做的最主要的三件事:

  • 将请求的数据(如:Json格式)转换为模型类对象(反序列化
  • 操作数据库
  • 将模型类对象转换为响应的数据(如:Json格式)(序列化)

在视图中需要做的最核心的事:

  • 将数据库数据序列化为前端所需要的格式,并返回
  • 将前端发送的数据反序列化为模型类对象,并保存到数据库中

二、常用序列化器类

1、serializers.Serializer

子应用下先创建一个名为serializers.py的模块,在该模块下需要引入serializers模块,并创建序列化器类ProjectsSerializer继承serializers.Serializer父类

from rest_framework import serializers
class ProjectSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=200, label="项目名称", help_text='项目名称')
    leader = serializers.CharField(max_length=50, label="项目负责人", help_text='项目负责人')
    programmer = serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
    tester = serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")

字段说明:

max_length
    最大长度:在反序列化时进行输入最大长度校验
min_length
    最小长度:在反序列化时进行输入最小长度校验
allow_blank
    是否允许为空:在反序列化时允许传空白字符串,默认不允许
max_value
    最大值:在反序列化时进行输入最大值校验
min_value
    最小值:在反序列化时进行输入最小值校验
read_only
    表明该字段仅用于序列化输出,但在反序列化验证时不做校验,默认False
write_only
    表明该字段仅用于反序列化输入,但在序列化时不进行输出,默认False
required
    表明该字段在反序列化时必须输入,序列化时必须输出,默认True
default
    反序列化时使用的默认值,如果不指明,在传递时默认值为0
allow_null
    表明该字段是否允许传入None,默认False
validators
    该字段使用的验证器
error_messages
    包含错误编号与错误信息的字典
label
    用于HTML展示API页面时,显示的字段名称,相当于模型类字段的verbose_name属性
help_text
    用于HTML展示API页面时,显示的字段帮助提示信息

(1)序列化模型类对象

在视图类模块下,返回的为模型类对象时,使用步骤如下:

  • 实例化一个序列化器类,将模型类对象传给instance变量,并返回一个序列化器类对象
  • 调用序列化器类对象的data属性后传入JsonResponse并return
obj = Projects.objects.get(id__exact=pk)
serializer_obj = ProjectSerializer(instance=obj)
return JsonResponse(serializer_obj.data)

(2)序列化查询集

在视图类模块下,返回的为查询集时,使用步骤如下:

  • 实例化一个序列化器类,将模型类对象传给instance变量,并且设置many为True,并返回一个序列化器类对象
  • 调用序列化器类对象的data属性后传入JsonResponse,设置safe=False,并return
qs = Projects.objects.all()
serializer_obj = ProjectSerializer(instance=qs, many=True)
return JsonResponse(serializer_obj.data, safe=False)

(3)需自定义create和update方法

    def create(self, validated_data):
        # validated_data参数为校验通过之后的数据
        # 必须将创建成功的模型类对象返回
        obj = Projects.objects.create(**validated_data)
        return obj

    def update(self, instance, validated_data):
        # instance为待更新的模型类对象
        # validated_data参数为校验通过之后的数据
        # 必须将更新成功的模型类对象返回
        instance.name = validated_data.get('name') or instance.name
        instance.leader = validated_data.get('leader') or instance.leader
        instance.tester = validated_data.get('tester') or instance.tester
        instance.programmer = validated_data.get('programmer') or instance.programmer
        instance.desc = validated_data.get('desc') or instance.desc
        instance.save()
        return instance

2、serializers.ModelSerializer

子应用下先创建一个名为serializers.py的模块,在该模块下需要引入serializers模块,并创建序列化器类ProjectsModelSerializer继承serializers.ModelSerializer父类

2.1 特性

  • 1.filed字段不需要自己写,与模型一一对应
    基于模型类的字段条件创建约束
  • 2.ModelSerializer中定义了与本来需要序列化字段同名的字段,会覆盖原来的模型类映射的字段
  • 3.简单的实现了create和update方法,可根据需求重写
    调用父类的creat和update方法时,validated_data不需要解包
    - super().update(instance, validated_data)
    - super().create(validated_data)

2.2 自定义Meta参数属性

mode:关联的模型类
fields:

  • 使用fields来明确字段, 可以写明具体哪些字段
  • 也可以写all,所有字段都生成序列化规则

exclude:可以明确排除掉哪些字段
read_only_fields:指明只读字段,即仅用于序列化输出的字段
extra_kwargs:为ModelSerializer添加或修改原有的选项参数,来定制某些字段(嵌套字典)


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352