数据序列化

序列化的定义:

序列化 (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__'  # 领域

你可能感兴趣的:(数据序列化)