序列化操作

序列化操作

# 创建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是有序字典类型。

关联对象嵌套序列化

1)PrimaryKeyRelatedField

# 在HeroInfoSerializer中添加此字段
hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
或
hbook = serializers.PrimaryKeyRelatedField(label='图书', queryset=BookInfo.objects.all())

1552472-20190801222458705-410827169.png

1552472-20190801200327422-736945863.png

1552472-20190801200337178-1316971008.png

many参数

1552472-20190801230441990-1539823249.png
1552472-20190801230448823-729655273.png

反序列化操作

  • 反序列化操作-数据校验
# 准备数据
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中的数据进行校验。

补充验证

在调用is_valid进行数据校验时,除了一些基本的默认验证行为,可能还需要补充一些验证行为,比如有如下需求:
1)在进行btitle验证时,要求btitle的内容必须含有django。
2)在进行bread和bcomment验证时,要求bread必须大于等于bcomment。
需要再补充验证行为,可以使用以下三种方法

1) validators : 针对指定序列化器字段添加validators选项参数补充校验
1552472-20190731185438545-1057769742.png

2) validate_<field_name> : 在序列化器类中定义特定方法validate_<field_name>,针对特定字段进行补充验证
1552472-20190731185457115-708489616.png

3) validate : 在序列化器类中定义validate方法针对多个字段的内容进行补充验证
1552472-20190731185514414-553568896.png

数据保存

在数据校验通过之后,想要基于validated_data完成数据的保存,可以通过序列化器对象.save()进行数据的保存

  • create方法中实现数据新增
  • update方法中实现数据更新
    如果没有传递instance实例,调用save()方法的时候,create()被调用,相反,如果传递了instance实例,调用save()方法的时候,update()被调用
    1552472-20190731191047858-1594537579.png

转载于:https://www.cnblogs.com/oklizz/p/11272989.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值