微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

序列化器嵌套序列化器,重写序列化器create和update方法与使用事务保存数据

序列化器嵌套序列化器

规格表序列化器

class SKUSpecificationSerialzier(serializers.ModelSerializer):
    """
        SKU规格表序列化器
    """
    spec_id = serializers.IntegerField()
    option_id = serializers.IntegerField()
     Meta:
        model = SKUSpecification  # SKUSpecification中sku外键关联了SKU表
        fields = ("spec_id",'option_id')

商品表序列化器

 SKUSerializer(serializers.ModelSerializer):
  #增加外键的字段 spu_id
= serializers.IntegerField() category_id = serializers.IntegerField() spu = serializers.StringrelatedField(read_only=True) category = serializers.StringrelatedField(read_only=True)   
  #实现序列化器的嵌套
specs
= SKUSpecificationSerialzier(many=True) Meta: model=SKU fields=__all__'

重写序列化器create和update方法

认情况下,嵌套串行器是只读的。如果要支持对嵌套序列化器字段的写操作,则需要创建create()和/或update()方法,以明确指定应如何保存子关系。

def create(self,validated_data):
         获取规格信息,并从validated_data数据中,删除规格信息数据
        specs_data = validated_data.pop(specs')
         保存sku
        sku = SKU.objects.create(**validated_data)
         对规格信息进行遍历,来保存商品规格信息
        for spec_data in specs_data:
            SKUSpecification.objects.create(sku=sku,**spec_data)
         返回sku
        return sku
     update(self,instance,validated_data):
    删除规格信息数据
    specs_data = validated_data.pop()

     方案一: 调用父类 ,去实现没有问题的数据更新
    super().update(instance,validated_data)

     方案二
    获取pk
     pk = self.context['view'].kwargs.get('pk')
     #更新数据
     SKU.objects.filter(id=pk).update(**validated_data)

     方案三 把父类的源码 拿来
     for attr,value in validated_data.items():
         setattr(instance,attr,value)
     instance.save()

     specs_data:
         item {spec_id: "4",option_id: 8}
        SKUSpecification.objects.filter(sku=instance,spec_id=spec_data.get()). \
            update(option_id=spec_data.get())

    return instance

使用事务保存数据

)

        with transaction.atomic():
             开启事务
            savepoint = transaction.savepoint()
             保存sku
            sku = SKU.objects.create(**validated_data)
             specs_data:
                SKUSpecification.objects.create(sku=sku,1)">spec_data)
             清除保存点
            transaction.savepoint_commit(savepoint)
             返回sku
            return sku

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐