DRF 中的模型序列化到底该怎么用?

开发 前端
本章讲到模型普通序列化的步骤,关于模型序列化、序列化嵌套、项目实战中流程,我将在下一篇文章进行说明。

[[407827]]

本文转载自微信公众号「AirPython」,作者星安果。转载本文请联系AirPython公众号。

1. 前言

大家好,我是安果!

接下来,将通过几篇文章将对 DRF 模型序列化进行展开说明,详情谈谈模型序列化的作用、步骤及进阶用法

2. 模型序列化的作用?

作为 DRF 中非常关键的一步,模型序列化主要作用有 3 个

  • 序列化数据

用于将模型序列化成 JSON 格式的对象,便于数据返回

  • 表单验证

在表单请求中,用于验证用户上传的数据是否满足项目要求

  • 数据操作

可用于数据更新、数据创建、数据保存等

3. 表单字段验证

指定需要序列化的字段时,可以设置字段类型、默认值、可读或可写、验证错误提示信息等,然后针对表单字段进行验证

表单字段验证同样有 3 种方式,分别对应:

3-1 序列化字段,使用参数形式进行制定

比如,字段 name 数据类型为字符串,max_length 指定最大长度,必须输入,并使用「 error_messages 」设置验证失败的提示信息

  1. # 最大长度50 
  2. # required=True:必须输入 
  3. # 如果不传递,则报错:name必须要传递 
  4. name = serializers.CharField(max_length=50, required=True, error_messages={"required""name必须要传递"}) 

3-2 重写 validate( self , attrs ) 方法进行验证

参数 attrs 包含所有字段

我们只需要自定义验证逻辑,如果验证不通过,抛出「 serializers.ValidationError 」异常即可

比如,这里验证 name 中必须包含关键字「 深圳 」,否则抛出异常(代表验证失败)

  1. def validate(self, attrs): 
  2.     ""
  3.     表单数据验证 
  4.     :param attrs: 
  5.     :return
  6.     ""
  7.     print(attrs) 
  8.     if "深圳" not in attrs.get("name"): 
  9.         raise serializers.ValidationError('名称中没有包含【深圳】,验证失败!'
  10.     return attrs 

3-3 重写 validate_字段名(self,value) 方法

单独针对某个字段进行验证

比如,我们还是对 name 字段进行验证,如果验证不通过,主动抛出「 serializers.ValidationError 」异常即可

  1. def validate_name(self, name): 
  2.     ""
  3.     对name字段进行验证 
  4.     :param name:  
  5.     :return:  
  6.     ""
  7.     if "深圳" not in name
  8.         raise serializers.ValidationError('名称中没有包含【深圳】,验证失败!'
  9.     return name 

4. 重写创建、更新方法

创建的序列化类继承于 serializers.Serializer 类

这里重写 update() 和 create() 函数

其中,

  • update( self, instance, validated_data )

用于更新数据,将参数 validated_data 中的数据更新到 instance 中

  • create(self, validated_data)

validated_data 作为关键字参数,用于创建模型

  1. class GoodsSerializer(serializers.Serializer): 
  2.     # 需要序列化的字段 
  3.     # 注意:自动生成的字段,只会涉及读取的场景 
  4.     id = serializers.IntegerField(read_only=True
  5.  
  6.     # error_messages:定义错误信息 
  7.     name = serializers.CharField(max_length=200, required=True, error_messages={"required""name参数必须要传递"}) 
  8.  
  9.     def update(self, instance, validated_data): 
  10.         ""
  11.         更新数据,将validated_data中的数据更新到instance中 
  12.         :param instance: 
  13.         :param validated_data: 
  14.         :return
  15.         ""
  16.         # 修改数据 
  17.         instance.name = validated_data.get("name", instance.name
  18.  
  19.         # 保存更新 
  20.         instance.save() 
  21.         return instance 
  22.  
  23.     def create(self, validated_data): 
  24.         ""
  25.         创建数据 
  26.         :param validated_data: 
  27.         :return
  28.         ""
  29.         # Goods:模型 
  30.         return Goods.objects.create(**validated_data) 

5. 最后

本章讲到模型普通序列化的步骤,关于模型序列化、序列化嵌套、项目实战中流程,我将在下一篇文章进行说明。

 

责任编辑:武晓燕 来源: AirPython
相关推荐

2023-11-27 12:24:23

算法模型业务模型

2023-12-13 13:49:52

Python序列化模块

2011-06-01 14:26:11

序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2011-06-01 15:05:02

序列化反序列化

2018-03-19 10:20:23

Java序列化反序列化

2011-04-02 13:47:01

2009-06-14 22:01:27

Java对象序列化反序列化

2009-08-24 17:14:08

C#序列化

2011-07-09 16:25:00

笔记本技巧

2011-07-06 17:07:08

笔记本技巧

2012-04-13 10:45:59

XML

2023-12-26 07:26:07

Java序列化反序列化机制

2011-05-18 15:20:13

XML

2009-08-06 11:16:25

C#序列化和反序列化

2010-03-19 15:54:21

Java Socket

2009-07-29 13:39:02

JSON序列化和反序列ASP.NET AJA

2015-05-20 10:05:10

Ceph分布式文件系统序列化

2019-11-20 10:07:23

web安全PHP序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化
点赞
收藏

51CTO技术栈公众号