您的位置:首页 > 其它

数据序列化

2020-01-14 19:02 211 查看

序列化的定义:

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。

应用场景:

我们在视图类中从数据库拿到的数据,其类型是QuerySet,不能直接传给接口

在这里我们回顾一下

  1. values()方法:

    goods_list = models.goods.objects.all()
    goods_list = list(goods_list.values('id', 'name', 'count', 'created'))
    return HttpResponse(goods_list)
  2. 遍历\查询集,加入列表

    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__'  # 领域
  • 点赞
  • 收藏
  • 分享
  • 文章举报
沙威探长 发布了15 篇原创文章 · 获赞 4 · 访问量 852 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: