序列化和反序列化(增删改查)
一、什么是序列化与反序列化
我们把对象(或变量)从内存变成可存储或可传输的过程称之为序列化,在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})