序列化 (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 类,其中的字段与模型类字段对应。
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(多条记录)
例如,多对多关系,我们要展示用户的购物车信息,需要跨表查询
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类的所有属性 的元组
在建表时
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__' # 领域