模型序列化器编写方式
普通序列化器,很明显可以感觉到,如果模型类字段少了,还行,但是模型字段越来越多,那么开发者在序列化器里所要复刻的字段也要越来越多,而且光写了序列化器字段还不行,还得有字段属性,这个时候就有了现在的与模型类关联的序列化器,可以更加方便的进行字段映射以及内置方法的编写
特点:
- 可以基于模型类自动生成所有的字段
- 自动生成的系列字段,同时还包含unique max_length等属性校验
- 包含默认的create和update的实现
缺点:
- 不会自动映射模型类字段的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方法,不需要我们去重写更新方法