Django序列化基本操作

Django的基本的序列化与反序列化操作

  • 序列化-----> 也就是出库操作,多用于查询数据,把python串转成json字符
  • 反序列化—>也就是入库操作,多用于向数据库添加数据,把json串转成python字符

反序列化

# 1. 反序列化----单表入库操作
*** views.py文件里 ***

class Addcate(APIView):
    def post(self,request):
        # 用postman进行存入数据
        data = request.data
        # 把定义好的反序列化拿来进行存入数据,也就是把获取的数据转成python串
        cate = CateUnserializer(data=data)
        # 判断cate值,is_valid()它自带的一个判断方法。
        if cate.is_valid():
            cate.save()
	            return HttpResponse('YES')
        return HttpResponse('No')
        
*** serializer.py文件里 ***

# 1). 反序列化  添加分类
# 序列化导包
from rest_framework import serializers
class CateUnserializer(serializers.Serializer):
    # 反序列化是 serializers.Serializer
    name = serializers.CharField(max_length=32)
    # 添加(‘固定的值’)
    # data = {'name':'dsds','pwd':123}
    
    # **data  => name='dsds',pwd=123
    def create(self,data):
        return Cate.objects.create(**data)

反序列化添加及修改

# 2. 添加商品,且所属分类 
=== views.py文件 ===
class AddGoods(APIView):
    def post(self,request):
        # 例,只是把data定义成一个固定的值,进行存储
        #** data = {'name':'oppo','cates':1}
        data = {'name':'oppo','cates_id':1}
        goods = GoodsUnserializer(data=data)
        if goods.is_valid():
            goods.save()
            return HttpResponse('OK')
        return HttpResponse('不OK')

===serializer.py ====
#2). 反序列化 --出库----添加商品

class GoodsUnserializer(serializers.Serializer):
    name = serializers.CharField(max_length=32)
    # 在我们的商品表里有外建字段,是int类型(两种存储方式)
    #** cates = serializers.IntegerField()
    cates_id = serializers.IntegerField()

    # 添加商品、
    def create(self,data):
    
        #** return Goods.objects.create(
           #  cates_id = data.pop('cates'),**data)
           
    	 return Goods.objects.create(**data)
    	 
   ==== serializer.py里 ====
    # 修改商品---->包含三个参数(self,instance,data)
    def update(self,instance,data):
        # instance == Goods.objects.filter(id=2)
        return instance.update(**data)

=== views.py ===
    # 修改制定字段的类型
    def put(self,request):
        goods = Goods.objects.filter(id=1)
        data = {'name':'iphone','cates':2}
        g = GoodsUnserializer(goods,data=data)
        if g.is_valid():
            g.save()
            return HttpResponse('YES')
        return HttpResponse('NO')

序列化的基本操作

# 4*用序列化查询分类
===== views.py =====
class Getcate(APIView):
    def get(self,request):
        # 查询出id为1的分类
        cate = Cate.objects.filter(id=1).first()
        # 查询的结果为first(),就是many=False,也可以不用书写
        # 查询的结果为all(),就是many=True
        ser = CateSerializer(cate)
        return JsonResponse(ser.data)
        
====serializer.py =========

# 4* 序列化--出库 ------  cate
class CateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Cate
        fields = '__all__'
        # fields = ("name",) # 保证是一个元组,或列表
        # exclude = ("name",) # 除了Name之外的所有字段
---------------------------------------------------------------------------------------------------
===== views.py =====

# 用序列化查询商品,并且查询属于谁的分类
class Getgoods(APIView):
    def get(self,request):
        # 查询出id为2的商品
        goods = Goods.objects.filter(id=2).first()
        # 进行序列化转数据类型
        ser = GoodsSerializer(goods)
        return JsonResponse(ser.data)
        
====serializer.py =========

# 商品的序列化
class GoodsSerializer(serializers.ModelSerializer):
    # 当查询的数据有外建指向,且想显示出姓名,就可以用下面方法利用外建属性直接指定
    catems = serializers.CharField(source='cates.name')
    class Meta:
        model = Goods
        fields = ('catems','id','name')
----------------------------------------------------------------------------------
 # 当我们查询的需求在俩个序列化里,我们可以通过以下的方法导进来
 # goods = GoodsModelSerializer(many=True)就可以使用了,
 # 他最后的数据类型是[{}]
#class ShopModelSerializer(serializers.ModelSerializer):
    # goods = GoodsModelSerializer(many=True)
    # class Meta:
    #     model = Shop
    #     fields = '__all__'

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