sdu项目实训2-1 DRF中序列化器的使用

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()

已经修改了数据库中的数据
在这里插入图片描述

总结

序列化器对于数据库的操作还是非常有用的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值