• Django 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. 最后

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

    如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

    分享 Python 自动化及爬虫、数据分析实战干货,欢迎关注。
  • 相关阅读:
    范德蒙矩阵相关
    bat运行exe程序
    github 用token远程连接(三)
    为什么将样本方差除以N1?
    Git commit格式 详解(二)
    C++中this与*this的区别
    函数末尾加入const的作用
    git 使用小补充(四)
    人工智能 机器学习
    机器学习分类
  • 原文地址:https://www.cnblogs.com/xingag/p/14948886.html
Copyright © 2020-2023  润新知