首页 > 其他分享 >反序列化(添加和更新)

反序列化(添加和更新)

时间:2022-10-24 17:23:57浏览次数:85  
标签:validated serializers age 更新 instance 添加 序列化 data

反序列化(添加和更新)

6.1 添加数据

序列化器

class Student1Serializer1(serializers.Serializer):
    """学生信息序列化器"""

    # 1.转换的字段说明
    # 字段 = serializer.字段类型(选项=选项值)

    id = serializers.IntegerField(read_only=True)  # 反序列化阶段不会要求id有值
    name = serializers.CharField(required=True)  # 反序列化阶段必填
    sex = serializers.CharField(default="男")  # 反序列化阶段如果没填,则使用默认值
    age = serializers.IntegerField(min_value=0, max_value=100, error_messages={
        "min_value": "the age must be age>=100",
        "max_value": "the age must be age<=100"
    })
    classroom = serializers.CharField(default="310",validators=[check_classroom])  # 反序列化阶段如果没填,则使用默认值
    info = serializers.CharField(allow_null=True, allow_blank=True)  # 允许客户端不填写(None),或者为""

    # 2.如果当前序列化器继承的是Modelserializer,则需要声明需要调用的模型信息
    # class Meta:
    #     model = 模型名
    #     fields = ["数据库字段名1","数据库字段名2","数据库字段名3",....,"数据库字段名n",] 或 "__all__"

    # 3.验证代码的对象方法(钩子函数)
    def validate(self, attrs):  # validate是固定的
        """
        验证来自客户端的所有数据
        :param: attrs 序列化器实例化时,传入的data
        这个方法经常用于密码和确认密码的校验,因为需要多个字段的数据
        """

        # 310教室只有女生,不能有男生
        if attrs["classroom"]=="310" and attrs["sex"] == "男":
            raise serializers.ValidationError("310教室不能有男生,只能有小姐姐。")
        return attrs

    def validate_name(self, data):  # 方法名必须以validate_<字段名>来命名
        """
        验证单个字段
        该方法会自动被is_valid()调用
        """
        if data in ["python","django"]:
            raise serializers.ValidationError("学生姓名不能是python或django")

        # 验证成功必须返回data
        return data

    # 4.模型操作方法

    def create(self, validated_data): # 添加数据后,字典自动变为模型对象
        """
        添加数据,validated_data就是验证成功后的结果
        """
        student = studentsInfo.objects.create(**validated_data)
        return student


视图

class StudentView(View):

       def get(self, request):
        """反序列化-采用字段选项来验证数据-验证失败抛出异常"""
        # 1.接收客户端提交的数据
        # data = json.loads(request.body)
        data = {
            "name": "彭于晏",
            "age": 30,
            "sex": "男",
            "classroom": "666",
            "info": "要做个猛男,要猛!"
        }
        # 2.实例化序列化器,获取序列化对象
        serializer = Student1Serializer1(data=data)
        # 3.调用序列化器进行数据验证
        serializer.is_valid(raise_exception=True) # 抛出异常,代码不会往下执
        # 4.获取验证以后的结果,操作数据库
        serializer.save() # 如果在实例化序列化器对象的时候没有传入instance属性,则自动调用序列化器的create钩子函数方法
        # 5.返回结果
        return JsonResponse(serializer.data,status=201)

响应结果

{
    "id": 15,
    "name": "彭于晏",
    "sex": "男",
    "age": 30,
    "classroom": "666",
    "info": "要做个猛男,要猛!"
}

数据库变化

x2oIWq.png

6.1 更新数据

序列化器

class Student1Serializer1(serializers.Serializer):
    """学生信息序列化器"""

    # 1.转换的字段说明
    # 字段 = serializer.字段类型(选项=选项值)

    id = serializers.IntegerField(read_only=True)  # 反序列化阶段不会要求id有值
    name = serializers.CharField(required=True)  # 反序列化阶段必填
    sex = serializers.CharField(default="男")  # 反序列化阶段如果没填,则使用默认值
    age = serializers.IntegerField(min_value=0, max_value=100, error_messages={
        "min_value": "the age must be age>=100",
        "max_value": "the age must be age<=100"
    })
    classroom = serializers.CharField(default="310",validators=[check_classroom])  # 反序列化阶段如果没填,则使用默认值
    info = serializers.CharField(allow_null=True, allow_blank=True)  # 允许客户端不填写(None),或者为""

    # 2.如果当前序列化器继承的是Modelserializer,则需要声明需要调用的模型信息
    # class Meta:
    #     model = 模型名
    #     fields = ["数据库字段名1","数据库字段名2","数据库字段名3",....,"数据库字段名n",] 或 "__all__"

    # 3.验证代码的对象方法(钩子函数)
    def validate(self, attrs):  # validate是固定的
        """
        验证来自客户端的所有数据
        :param: attrs 序列化器实例化时,传入的data
        这个方法经常用于密码和确认密码的校验,因为需要多个字段的数据
        """

        # 310教室只有女生,不能有男生
        if attrs["classroom"]=="310" and attrs["sex"] == "男":
            raise serializers.ValidationError("310教室不能有男生,只能有小姐姐。")
        return attrs

    def validate_name(self, data):  # 方法名必须以validate_<字段名>来命名
        """
        验证单个字段
        该方法会自动被is_valid()调用
        """
        if data in ["python","django"]:
            raise serializers.ValidationError("学生姓名不能是python或django")

        # 验证成功必须返回data
        return data

    # 4.模型操作方法

    def create(self, validated_data): # 添加数据后,字典自动变为模型对象
        """
        添加数据,validated_data就是验证成功后的结果
        """
        student = studentsInfo.objects.create(**validated_data)
        return student

    def update(self, instance, validated_data): # 更新数据后,字典自动变为模型对象
        """更新数据后,字典自动变为模型对象"""
        instance.name = validated_data["name"]
        instance.sex = validated_data["sex"]
        instance.age = validated_data["age"]
        instance.classroom = validated_data["classroom"]
        instance.info = validated_data["info"]

        return instance

视图

class StudentView(View):
    def get4(self, request):
            """反序列化-采用字段选项来验证数据-验证失败抛出异常"""
            # 1.接收客户端提交的数据
            # data = json.loads(request.body)
            pk = 15
            try:
                student = studentsInfo.objects.get(id=pk)
            except studentsInfo.DoesNotExist:
                return JsonResponse({"errors":"当前学生不存在"},status=400)

             data = {
                "name": "李坤城",
                "age": 100,
                "sex": "女",
                "classroom": "000",
                "info": "要做个猛男,要猛!"
        }
            # 2.实例化序列化器,获取序列化对象
            serializer = Student1Serializer1(instance=student,data=data)
            # 3.调用序列化器进行数据验证
            serializer.is_valid(raise_exception=True)  # 抛出异常,代码不会往下执
            # 4.获取验证以后的结果,操作数据库
            serializer.save()  # 如果在实例化序列化器对象的时候没有传入instance属性,则自动调用序列化器的create钩子函数方法
            # 5.返回结果
            return JsonResponse(serializer.data, status=201)

响应结果

{
    "id": 15,
    "name": "李坤城",
    "sex": "女",
    "age": 100,
    "classroom": "000",
    "info": "要做个猛男,要猛!"
}

数据库变化

[x2ozf1.png](

标签:validated,serializers,age,更新,instance,添加,序列化,data
From: https://www.cnblogs.com/minqiliang/p/16822135.html

相关文章

  • 模型类序列化器
    模型类序列化器7.1序列化多条数据序列化器classStudentModelSerializer(serializers.ModelSerializer):"""学生信息序列化器"""classMeta:model......
  • 序列化器的简单使用
    序列化器的简单使用3.1新建appdjango-adminstartappsers3.2注册appINSTALLED_APPS=[#'django.contrib.admin','django.contrib.auth','django.......
  • Nessus 更新
    Nessus更新 1.暂停服务ntestop"tenablenessus"2.将plugin_feed_info.inc和plugins拷贝到安装目录nessus\nessus路径下进行替换copy.\plugin_feed_info.incC:\Pr......
  • 绍大2022级ACM集训队新生选拔赛题解(更新中)
    绍大2022级ACM集训队新生选拔赛题解(更新中)  A.Honest大致题意在一个n*n的矩阵统计“honest”这个单词的个数。基本思路本题是签到题,只要用二维数组读入字符矩阵......
  • 【转】MyBatis 通过Map更新
     原文:mybatis使用map批量更新(Oracle)有个需求,MyBatis通过Map的key作为条件,value作为更新后的值来更新数据。 <updateid="batchUpdateLogistics"parameterType="m......
  • 浅谈响应式更新在输入输出处理中的应用
    简介前端的一大重点是处理输入和输出,而vue的响应式系统给输入与输出的维护带来极大便利。将命令式操作转为响应式更新,我们不再需要为代码中充斥着大量手动的数据更新过......
  • 在线程中更新UI
    为了更新UI线程,在新线程中用this.Invoke来更新UI上控件的值。其实这背后是有异常的(有可能会在vs中报出来),因为当你关闭窗体时,this已经不存在了,但访问this.Invoke在新的线程......
  • 新功能发布 | TSMaster重大更新,一文了解信号映射操作流程
    前言今天介绍TSMaster新功能—信号映射。这个功能在旧版本里,只能实现从CAN信号到系统变量的映射,软件更新以后可以支持系统变量反向映射到信号,甚至可以实现通过表达方式进行......
  • IBatisNet 开发指南系列文章更新
              两周前完成 ​​​IBATISNETNET1.3开发指南系列文章​​​   ,只是作了最基本的介绍。最近工作忙,没什么时间写,今天放假了,花了大半天时间才写......
  • 更新npm的版本命令(npm WARN config global ‘–global’, ‘–local’ are deprecated
    查看npm版本在cmd窗口,输入npm-v查看npm的版本号,目前最新的式8.17.0或者在安装vue脚手架的时候出现这种情况npmWARNconfigglobal‘–global’,‘–local’aredepr......