模型类序列化-----关于模型类序列化器

模型序列化器编写方式

普通序列化器,很明显可以感觉到,如果模型类字段少了,还行,但是模型字段越来越多,那么开发者序列化器里所要复刻的字段也要越来越多,而且光写了序列化器字段还不行,还得有字段属性,这个时候就有了现在的与模型类关联的序列化器,可以更加方便的进行字段映射以及内置方法的编写

特点:

  1. 可以基于模型类自动生成所有的字段
  2. 自动生成的系列字段,同时还包含unique max_length等属性校验
  3. 包含默认的createupdate的实现

缺点:

  1. 不会自动映射模型类字段的default属性

       

class Staff(models.Model):
    SEX_CHOICE = (
        (1,'男'),
        (0,'女')
    )
    name = models.CharField(max_length=30,verbose_name='员工')
    # 小整型 这里的只有 1 0 ,,,1代表的是男生,0代表的是女
    sex = models.SmallIntegerField(verbose_name='性别',default=1,choices=SEX_CHOICE)
    phone = models.CharField(verbose_name='手机号',max_length=11)
    email = models.CharField(verbose_name='邮箱',max_length=50)
    department = models.ForeignKey(to=Department,on_delete=models.CASCADE,verbose_name='部门')
    duty = models.ForeignKey(to=Duty,on_delete=models.CASCADE,verbose_name='职务')
    # 外键关联 ---部门 职责

列如图中的性别选项,default他只会映射出1,并不会把1代表的字符串展示出来,具体解决方法,咱们下次在讲

那么如何创建一个模型类序列化器呢

# 序列化器文件-----模型序列化器
from rest_framework import serializers
from myapp.models import Student
#                               继承模型序列化器
class StudentModelSerializer(ModelSerializer):
    # 在这定义元类
    class Meta:
        model = #    # 指明需要进行序列化的模型类(改成你需要序列化的模型类名字)
        fields = "__all__"  # all 是全部的意思 指明模型类的全部字段参与序列化和反序列化的操作
  • 序列化器元类属性中的model属性关联模型类
  • 序列化器元类属性中的fields属性指明序列化器需要处理的字段 (你也可以不指定全部字段,比如单独的一个字段,name,也是可以的)
class StaffSer(ModelSerializer):
    class Meta():
        model = Staff
        fields = ['name']
只需要把 all 换成你需要的字段就可以了

1.模型类关联的序列化器和普通的序列化器使用方法一样

使用序列化器返回当前所有的商品数据,还是像之前一样传入instance参数即可,还要记得如果是多个商品,不是单独数据,要记得加many=True参数

反序列化----模型类如何进行反序列化

1.模型序列化器的创建就更简单了,基本不需要手动实现create方法

    def post(self,request):
        ders = request.data.get('name')
        dss = Staff.objects.filter(name=ders)
        if not dss:
            ser = StaffSer(data=request.data)
            if ser.is_valid():
                ser.save()
                return Response({'msg': '添加成功', 'code': 200})
            else:
                return ({'msg': '添加失败', 'code': 401, 'data': ser.data})
        else:
            return Response({'msg': '员工已经存在', 'code': 401})


#为序列化器绑定数据,ser=Serializer(data=request.data) data=request.data代表你要开始进行反序列化了
# if ser.is_valid()   是校验数据
#校验通过,存储入库,ser.save()
#return Response返回数据

注意:反序列化自动生成的字段属性中,不会包含原始模型类字段中的default字段属性,

更新某一个商品数据,模型序列化器也是自带了update方法,不需要我们去重写更新方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值