django 不包括字段 序列化器_Django:(08)序列化器

1、序列化和反序列化

变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。

反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

序列化是将对象状态转换为可保持或可传输的形式的过程。序列化的补集是反序列化,后者将流转换为对象。这两个过程一起保证数据易于存储和传输。

2、Django中序列化器的定义和使用

定义:两种方法定义序列化器(serializer/ModelSerializer)

classCartSKUSerializer(serializers.ModelSerializer):"""购物车商品数据序列化器"""count= serializers.IntegerField(label='数量')classMeta:

model=SKU

fields= ('id', 'name', 'default_image_url', 'price', 'count')

使用:

查询模型类

实例一个序列化器,传入模型类对象

获取序列化后的结果(data属性)

query_set =Department.objects.all()

serializer= DepartmentSerializer(query_set, many=True)#传入对象集时需指定many=True

serializer.data

3、Django中反序列化的参数校验

基本校验:

序列化器的创建: 通过data传入字典数据:

Serializer(instance=None, data=empty, **kwarg)

通过is_valid方法校验参数合法性

errors属性: 获取校验出错信息,字典类型。

validated_data属性: 校验通过得到的对象,类型为OrderedDict

通过 validators选项校验

在序列化器字段中添加validators选项参数进行校验

定义函数:

defvalidate_name(value):#校验部门名称

if not re.match('^[\u4e00-\u9fa5]+$', value):raise ValidationError('部门名称只能为中文')return value

在字段参数中添加选项:validators=[validate_name]

name = serializers.CharField(validators=[validate_name])

validate_:对字段进行验证

classDepartmentSerializer(serializers.Serializer):"""部门数据序列化器"""...defvalidate_name(self, value):#校验部门名称

if not re.match('^[\u4e00-\u9fa5]+$', value):raise ValidationError('部门名称只能为中文')return value

validate:同时对多个字段进行比较验证

#模型: users/models.py

classUser(models.Model):

password= models.CharField(max_length=30)#序列化器: users/serializer.py

classUserSerializer(serializers.Serializer):

password= serializers.CharField(max_length=30, write_only=True)

password2= serializers.CharField(max_length=30, write_only=True)defvalidate(self, attrs):#校验两次输入的密码是否正确

password = attrs['password']

password2= attrs['password2']if password !=password2:raise serializers.ValidationError('两次输入的密码不一样')return attrs

3、Django中反序列化保存和修改数据

Serializer类的三个方法

save()方法: 保存数据

create()方法: 新增数据

update()方法: 修改数据

新增或修改数据

Serializer(instance=None, data=empty)

新增:创建序列化器时,没有传递了instance参数

my_dict = {'name': '研发部xx', 'create_date': '2018-1-1'}

s= DepartmentSerializer(data=my_dict)

s.save()#新增

修改:创建序列化器时,传递了instance参数

department = Department.objects.get(id=1)

my_dict= {'name': '研发部xx', 'create_date': '2018-1-1'}

s= DepartmentSerializer(instance=department, data=my_dict)

s.save()#修改

部分修改:partial=True 参数

当修改数据时,序列化器默认要求传递所有required=True的字段,否则is_valid验证不通过

可以通过设置partial=True允许只修改部分字段,如下:

s = DepartmentSerializer(department, data={'create_date': '2017-1-1'}, partial=True)

4、模型类序列化器

定义

model 指明参照哪个模型类

fields 指定序列化器中的属性有哪些 (可以是模型类中的字段,也可以模型类中没有的但需要校验的属性,比如类似:短信验证码,确认密码)

classDepartmentSerializer2(serializers.ModelSerializer):classMeta:

model=Department

fields= '__all__' #包含模型类中所有的字段

指定序列化器中包含哪些字段:fields = ('id', 'name')

排除掉模型类中指定的字段:exclude = ('is_delete',)

指明只读字段

read_only_fields = ('id', 'create_date')

仅用于序列化输出,在反序列化时不会进行校验和修改

指定 关联属性的序列化方式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值