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

1. 前言

大家好,我是安果!

之前有写过一篇文章,聊到如何快速入门 Django DRF

5 分钟,带你快速入门 Django DRF

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

2. 模型序列化的作用?

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

  • 序列化数据

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

  • 表单验证

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

  • 数据操作

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

3. 表单字段验证

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

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

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

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

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

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

参数 attrs 包含所有字段

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

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

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

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

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

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

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

4. 重写创建、更新方法

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

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

其中,

  • update( self, instance, validated_data )

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

  • create(self, validated_data)

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

class GoodsSerializer(serializers.Serializer):
    # 需要序列化的字段
    # 注意:自动生成的字段,只会涉及读取的场景
    id = serializers.IntegerField(read_only=True)

# error_messages:定义错误信息
    name = serializers.CharField(max_length=200, required=True, error_messages={"required": "name参数必须要传递"})

def update(self, instance, validated_data):
        """
        更新数据,将validated_data中的数据更新到instance中
        :param instance:
        :param validated_data:
        :return:
        """
        # 修改数据
        instance.name = validated_data.get("name", instance.name)

# 保存更新
        instance.save()
        return instance

def create(self, validated_data):
        """
        创建数据
        :param validated_data:
        :return:
        """
        # Goods:模型
        return Goods.objects.create(**validated_data)

5. 最后

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

(0)

相关推荐

  • python测试开发django-rest-framework-88.反序列化

    前言 serializers.Serializer可以对modle模型中的字段序列化,并且必须写create和update两个方法.ModelSerializer可以看成是Serializer的一个升 ...

  • python测试开发django-rest-framework-85.序列化(ModelSerializer)

    前言 在使用 django-rest-framework 开发接口的时候,我们希望能设置有些字段是必填字段,有些字段是非必填字段. 在使用ModelSerializer 序列化的时候,可以个字段加一个 ...

  • 测试开发你不得不学的 REST API 开发

    现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势.显然API开发已经成为后端程序员的必备技能了,那作为一个测试,特别是把Django作为自己主要的自动化测试平台的测试开发,Djang ...

  • ModelViewSet+ModelSerializer使用

    ModelViewSet+ModelSerializer使用

  • python测试开发django-64.序列化(Serializer)

    前言 REST framework中的serializers与Django的Form和ModelForm类非常像.我们提供了一个Serializer类,它为你提供了强大的通用方法来控制响应的输出, 以 ...

  • 03 认识Django REST framework

    DRF简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 在开发REST API的视图中,虽然每个视图具体操作的数据不同,但增.删. ...

  • 11 Serializer组件

    知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 为什么要使用序列化组件? 视图中查询到的对象和queryset类型不 ...

  • Django-Vue搭建个人博客:Markdown正文

    原创 杜赛 杜赛说编程 博客文章需要排版,否则难以凸显标题.正文.注释等内容之间的区别.作为博客写手来说,比较流行且好用的排版是采用 Markdown 语法. 严格来说, Markdown 是一种排版 ...

  • drf—— 序列化组件

    ----->序列化器-Serializer 一.序列化组件介绍 #作用: 1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 -Book模型--序列化器-- ...

  • python测试开发django-rest-framework-92.DecimalField保留2位小数

    前言 我们在设置商品价格的时候,希望保留两位小数,FloatField是浮点数无法精确小数点几位,DecimalField可以精确几位小数点 DecimalField models.py设置商品表模型 ...