DRF:Django REST Framework
前言
- 序列化器的作用:
- ①序列化: 将模型类对象, 转成json(dict)数据
- ②反序列化: 把json(dict), 转成模型类对象 (校验,入库)
一、序列化
1.序列化器定义
定义城市粮食产量信息的序列化器
from rest_framework import serializers
from . import models
from .models import City_cropinfo
class City_cropinfoSerializer(serializers.Serializer): #定义类, 继承自Serializer
#字段名称、类型、选项和模型类一样
id= serializers.IntegerField(read_only=True,label='编号')
city = serializers.CharField(label='城市', max_length=10)
year = serializers.CharField(label='年份', max_length=10)
crop_type = serializers.CharField(label='种类', max_length=10)
area = serializers.FloatField(label='面积')
weight_all = serializers.FloatField(label='产量')
weight_avg = serializers.FloatField(label='单产')
2.序列化单个对象
将单条数据使用序列化器转成json(dict)数据
from agriculture.serializers import City_cropinfoSerializer
from agriculture.models import City_cropinfo
# 1,获取对象
crop_info = City_cropinfo.objects.get(id=1)
# 2,创建序列化器对象, instance 表示将哪一条数据进行序列化
serializer = City_cropinfoSerializer(instance=crop_info)
# 3,输出序列化之后的结果
serializer.data
'''
输出结果:
{'id': 1, 'city': '济南', 'year': '2000', 'crop_type': '小麦', 'area': 20961.0, 'weight_all': 1041055.0, 'weight_avg': 4966.0}
'''
3.序列化列表数据
可以使用序列化器对列表中的多个对象进行序列化
from agriculture.serializers import City_cropinfoSerializer
from agriculture.models import City_cropinfo
# 1,查询所有的数据
crop_infos = City_cropinfo.objects.filter(city='济南',year='2016')
# 2,创建序列化器对象,many=True 表示传入的是列表对象(多个数据)
serializer = City_cropinfoSerializer(instance=crop_infos, many=True)
# 3,输出序列化的结果
serializer.data
'''
输出结果:
[OrderedDict([('id', 17), ('city', '济南'), ('year', '2016'), ('crop_type', '小麦'), ('area', 206840.0), ('weight_all', 1262280.707), ('weight_avg', 6102.6914862)]), OrderedDict([('id', 3
4), ('city', '济南'), ('year', '2016'), ('crop_type', '玉米'), ('area', 192226.03333), ('weight_all', 1204944.1729), ('weight_avg', 6268.3714168)]), OrderedDict([('id', 51), ('city', '济
南'), ('year', '2016'), ('crop_type', '棉花'), ('area', 9979.0), ('weight_all', 12635.0), ('weight_avg', 1266.0)])]
'''
二、反序列化
1.字段校验
可以使用序列化器,对数据进行校验操作
- 序列化器:
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True,label='编号')
useraccount = serializers.CharField(label='账号', max_length=50)
password = serializers.CharField(label='密码', max_length=50)
username = serializers.CharField(label='用户名', max_length=50)
phone = serializers.CharField(label='电话', max_length=20)
email = serializers.EmailField(label='邮箱')
- 操作流程:
from agriculture.serializers import UserSerializer
# 1,准备字典数据
data_dict = {
'useraccount': '123456',
'password': '20000101',
'username': 'tomato',
'phone': '13166666666',
'email':'123456@qq.com'
}
# 2,创建序列化器对象
serializer = UserSerializer(data=data_dict)
# 3,校验, raise_exception=True, 校验不通过,抛出异常信息
# serializer.is_valid()
serializer.is_valid(raise_exception=True)
serializer.data
'''
输出结果:
{'useraccount': '123456', 'password': '20000101', 'username': 'tomato', 'phone': '13166666666', 'email': '123456@qq.com'}
'''
校验通过
2.create保存数据
可以将对象保存到数据库中
- 在序列化器中重写create方法
class UserSerializer(serializers.Serializer):
...
#重写create方法,实现数据入库
def create(self, validated_data):
# 1,创建user对象,入库
user = User.objects.create(**validated_data)
# 2,返回响应
return user
- 操作流程
from agriculture.serializers import UserSerializer
# 1,准备字典数据
data_dict = {
'useraccount': '123456',
'password': '20000101',
'username': 'tomato',
'phone': '13166666666',
'email':'123456@qq.com'
}
# 2,创建序列化器对象
serializer = UserSerializer(data=data_dict)
# 3,校验, raise_exception=True, 校验不通过,抛出异常信息
# serializer.is_valid()
serializer.is_valid(raise_exception=True)
#4,入库
serializer.save()
已将将数据加入了数据库
3.update更新数据
可以重写update方法, 更新数据库中指定的数据
- 在序列化器中重写update方法
class UserSerializer(serializers.Serializer):
...
# 重写update方法,实现数据更新
def update(self, instance, validated_data):
# 1,更新数据
instance.password = validated_data["password"]
instance.username = validated_data["username"]
instance.phone = validated_data["phone"]
instance.email = validated_data["email"]
instance.save()
# 2,返回数据
user = User.objects.get(id=instance.id)
return user
- 操作流程
from agriculture.models import User
from agriculture.serializers import UserSerializer
# 1,准备字典数据
user = User.objects.get(id=2)
data_dict = {
'useraccount':user.useraccount,
'password': '19991231',
'username': 'potato',
'phone': '13134588888',
'email':'654321@qq.com'
}
# 2,创建序列化器对象
serializer = UserSerializer(instance=user, data=data_dict)
# 3,校验
# serializer.is_valid()
serializer.is_valid(raise_exception=True)
# 4,入库
serializer.save()
已经修改了数据库中的数据