数据序列化
2020-01-14 19:02
211 查看
序列化的定义:
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
应用场景:
我们在视图类中从数据库拿到的数据,其类型是QuerySet,不能直接传给接口
在这里我们回顾一下
-
values()方法:
goods_list = models.goods.objects.all() goods_list = list(goods_list.values('id', 'name', 'count', 'created')) return HttpResponse(goods_list)
-
遍历\查询集,加入列表
cate = models.Cate.objects.all() cate = list(map(lambda x: {'id': x.id, 'name': str(x.name)}, cate)) return HttpResponse(cate)
ps:注意数据类型转化.
如果字段比较少时,上面的方法还可行,
如果字段较多时
ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应。
1. 无需对数据处理
from rest_framework import serializers class GoodsSerializersModel(serializers.ModelSerializer): class Meta: model = models.goods fields = '__all__'
只要传一个表名即可,如何使用这个类:
goods_list = models.goods.objects.all() goods_serializer = GoodsSerializersModel(goods_list, many=True) return HttpResponse(json.dumps(goods_serializer.data, ensure_ascii=False), content_type='application/json') 实例化时,传入查询集,和many=True(多条记录)
2. 多表
可实际上我们的取数据,并不局限在单表中,而且取出的数据未必直接能用,那么重写 ModelSerializer 的方法就不简单了,
例如,多对多关系,我们要展示用户的购物车信息,需要跨表查询
class CartSerializersModel(serializers.ModelSerializer): goods_id = serializers.IntegerField(source='goods.id') goods_name = serializers.CharField(source='goods.name') goods_price = serializers.DecimalField(source='goods.price', max_digits=10, decimal_places=2) goods_image = serializers.CharField(source='goods.image') goods_stock = serializers.IntegerField(source='goods.stock') goods_unite = serializers.CharField(source='goods.unite') class Meta: model = models.Cart fields = ('id', 'count', 'goods_id', 'goods_name', 'goods_price', 'goods_image', 'goods_stock', 'goods_unite')
Meta类的fields的属性值是包含的是 重写的ModelSerializer类的所有属性 的元组
3. choice属性
在建表时
class Goods(models.Model): STATUS_CHOICE = ((0, '上线'), (1, '下线')) status = models.SmallIntegerField(choices=STATUS_CHOICE, verbose_name='商品状态') ...
state01 = serializers.CharField(source=‘status’) 在写序列化类时
class GoodsSerializersModel(serializers.ModelSerializer): state = serializers.CharField(source='get_status_display') class Meta: model = models.Goods fields = '__all__' # 领域
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- (七)数据序列化-hessian2
- serialize和unserialize函数是序列化和反序列化PHP中数据的常用函数。
- 网络-数据序列化之protobuf
- python 中的pickle数据序列化模块
- 关于:JSON数据反序列化(待补充)
- Java数据通讯中使用Googgle Protobuf 序列化与反序列化
- XML序列化数据对象(一)
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- Struts2+JSON+jQuery实现异步交互数据时选择要序列化的属性(二使用XML配置方式)...
- 使用GVariant实现数据的序列化处理
- 各类数据的序列化以及反序列化的方法(与Java服务器通讯)
- .net JSON序列化数据
- ASP.NET AJAX客户端编程教程(3)——让JavaScript和C#无障碍沟通:数据类型自动转换&序列化
- .net2.0中的Json序列化数据
- (NO.00005)iOS实现炸弹人游戏(七):游戏数据的序列化表示
- 用js解析经json序列化后的C#的DateTime类型数据
- Django REST Framework实现动态序列化数据及动态分配权限
- 几种序列化协议(protobuf,xstream,jackjson,jdk,hessian)相关数据对比
- 在使用Linq to SQL并序列化一个数据对象的时候报System.InvalidOperationException异常,序列化类型XXX的对象时检测到循环引用。
- [导入]ASP.NET AJAX客户端编程之旅(三)——让JavaScript和C#无障碍沟通:数据类型自动转换&序列化