序列化器嵌套序列化器
规格表序列化器
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): ) 方案一: 调用父类 ,去实现没有问题的数据更新 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
原文地址:https://www.cnblogs.com/tracydzf
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。