序列化操做
# 建立User对象 user = User(name='smart', age=18) # 使用UserSerializer将user对象序列化为以下字段数据:{'name': 'smart', 'age': 18} serializer = UserSerializer(user) # 获取序列化以后的数据 serializer.data
- 序列化多个对象
- 若是要被序列化的是包含多个对象的查询集QuerySet或list,在建立序列化器对象时,须要添加
many=True
参数。
books = BookInfo.objects.all() serializer = BookInfoSerializer(books, many=True) - 获取序列化以后的数据 serializer.data # [ # OrderedDict([('id', 2), ('btitle', '天龙八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)), # OrderedDict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80)), # OrderedDict([('id', 4), ('btitle', '雪山飞狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24)), # OrderedDict([('id', 5), ('btitle', '西游记'), ('bpub_date', '1988-01-01'), ('bread', 10), ('bcomment', 10)]) # ]
注:OrderedDict是有序字典类型。python
关联对象嵌套序列化
1)PrimaryKeyRelatedField
# 在HeroInfoSerializer中添加此字段 hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True) 或 hbook = serializers.PrimaryKeyRelatedField(label='图书', queryset=BookInfo.objects.all())
- 使用场景: 1.通常用于关联字段进行校验时使用,但关联字段不多校验 2.在序列化某种模型时,须要一次性将关联的数据都序列化出来(拿到spu,找到规格,规格找到选项) 3.须要将关联序列化以后的结果直接展现在页面的时候,好比当选定spu时候,显示对应的规格,通常返回名称
many参数
反序列化操做
- 反序列化操做-数据校验
# 准备数据 data = {'name': 'admin', 'age': 30} # 使用UserSerializer对data中的数据进行反序列化校验 serializer = UserSerializer(data=data) # 调用is_valid进行数据校验,成功返回True,失败返回False serializer.is_valid() # 获取校验失败以后的错误提示信息 serializer.errors # 获取校验经过以后的数据 serializer.validated_data
注:调用is_valid时,会根据对应序列化类字段是否须要传递、字段类型以及一些选项参数对data中的数据进行校验。django
补充验证
在调用is_valid进行数据校验时,除了一些基本的默认验证行为,可能还须要补充一些验证行为,好比有以下需求:
1)在进行btitle验证时,要求btitle的内容必须含有django。
2)在进行bread和bcomment验证时,要求bread必须大于等于bcomment。
须要再补充验证行为,能够使用如下三种方法spa
-
validators : 针对指定序列化器字段<u>添加validators选项参数</u>补充校验
3d
-
validate_<field_name> : 在序列化器类中定义特定方法validate_<field_name>,针对<u>特定字段</u>进行补充验证
code
-
validate : 在序列化器类中定义validate方法针对<u>多个字段</u>的内容进行补充验证
对象
数据保存
在数据校验经过以后,想要基于validated_data完成数据的保存,能够经过序列化器对象.save()进行数据的保存blog
- create方法中实现数据新增
- update方法中实现数据更新
若是没有传递instance实例,调用save()方法的时候,create()被调用,相反,若是传递了instance实例,调用save()方法的时候,update()被调用