欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Django序列化基本操作

程序员文章站 2022-06-16 16:53:42
...

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__'