zoukankan      html  css  js  c++  java
  • 序列化和反序列化(增删改查)

    一、什么是序列化与反序列化
    我们把对象(或变量)从内存变成可存储或可传输的过程称之为序列化,在python中称之为picking;
    # pickle模块是python专用的持久化模块,可以持久化包括自定义类在内的各种数据;只能在python程序之间进行数据交换;
    # 自定义的类的实例如何保存在一个文件中?如何从文件中读取数据,并让他们在内存中再次恢复成自己对应的类的实例?

    按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,所以必须要把内存数据转换成为字节序列,输出到文件,这就是序列化;反之,从文件的字节恢复到内存,就是反序列化;

    二、为什么要序列话
    *持久化的保持状态
    *跨平台的数据交互(json)

    三、序列化代码
    创建serializers.py写序列化器

      from rest_framework import serializers
      from apps.app02.models import User
    
      class UserSer(serializers.Serializer):
          name = serializers.CharField(max_length=32)
          pwd = serializers.CharField(max_length=128)
    
    #自定义语法:.save()执行,就会立即调用create方法来创建数据
    def create(self, validated_data):
        """
        :param instance:
        :param validated_data: 是表单或者vue请求所携带的json数据
            {"name":"chenxin","pwd":"123"}
    
        """
        return User.objects.create(**validated_data)
    
    #instance
    #validated_data
    def update(self, instance, validated_data):
        """
        :param instance: 你的数据库里的需要查询的对象
        :param validated_data: 是表单或者vue请求所携带的json数据
                {"name":"chenxin","pwd":"123"}
    
        """
        instance.name = validated_data.get('name',instance.name)
        instance.pwd = validated_data.get('pwd',instance.pwd)
    
        instance.save()
        return instance
    
    #就是对name这个字段进行判断
    
      
    # def validate_name(self, attrs):
    #     name = attrs["name"]
    #     if name != 'name':
    #         raise serializers.ValidationError('这个用户不从在')
    #     return attrs
    

    增删改查操作

      from rest_framework.views import APIView
      from rest_framework.response import Response
      from apps.app02.models import User
      from apps.app02.ser import UserSer
      class Oued(APIView):
      #添加数据
          def post(self,request):
          #获取数据
          data = request.data
          # print(data)
          #序列化添加
          user_li = UserSer(data=data)
          #验证
          # print(user_li,'----------------------------------------')
          user_li.is_valid()
          #保存
          user_li.save()
          #如果异常抛出异常
        # print(user_li.errors)
        #返回结果
        return Response({'code':200})
    
    def get(self,request):
        #获取数据库中所有数据
        user = User.objects.all()
        # print(user,'---------------------------------')
        #(<QuerySet [<User: User object (1)>, <User: User object (2)>
        #序列化所有数据
        user_ser = UserSer(user,many=True)  #many=True  序列化所有数据
        # print(user_ser,'----------------------------------------------------------')
        #UserSer(<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>]>, many=True):
    
        #序列化出的数据不能直接返回需要添加到字典里
        res = {
            'data':user_ser.data
        }
        #返回结果
        return Response({'code':200,'data':res})
    
    def put(self,request):
        #获取数据
        data = request.data
    
        #获取id
        id = request.data.get('id')
        print(id)
        #通过模型找见id对应的数据
        user_l = User.objects.get(pk=id)
        print(user_l)
    
        #序列化
        user_ser = UserSer(user_l,data=data)
    
        #判断
        user_ser.is_valid()
    
        #保存
        user_ser.save()
    
        #返回值
        return Response({'code':200})
  • 相关阅读:
    DataTable 只保留想要的几列
    如何用多个字符串来切分字符串
    用.net 发送邮件
    sqlserver 行列转换
    sql面试题一 学生成绩
    将DataReader转换为DataTable
    C# 如何用多个字符串来切分字符串并去除空格
    SqlServer按时间自动生成生成单据编号
    实验一 Java开发环境的熟悉
    Java学习笔记心得——初识Java
  • 原文地址:https://www.cnblogs.com/chen-xin-666/p/13887435.html
Copyright © 2011-2022 走看看