项目场景:
使用DRF框架进行自定义保存时,涉及到多张表的存储,需要开启事务!
使用案例:
注意:因为只需要保存数据,所以在自定义序列化器中:
from rest_framework import serializers
from django.db import transaction
class SKUGoodsViewSerializer(serializers.ModelSerializer):
spu_id = serializers.IntegerField()
category_id = serializers.IntegerField()
class Meta:
model = SKU
fields = '__all__'
read_only_fields = ('spu', 'category')
def create(self, validated_data):
data = self.context['request'].data.get('specs')
# 开启事务
with transaction.atomic():
#设置保存点
save_point = transaction.savepoint()
try:
# 保存sku表
sku = SKU.objects.create(**validated_data)
#保存sku具体规格表
for spec in data:
SKUSpecification.objects.create(spec_id=spec['spec_id'], option_id=spec['option_id'], sku=sku)
except:
# 回滚
transaction.savepoint_rollback(save_point)
raise serializers.ValidationError('保存失败')
else:
#提交
transaction.savepoint_commit(save_point)
return sku