我有一个视图,将数据保存在两个不同的模型“Eliel_FuncionarioAlocacao”和“Eliel_FuncionarioAlocacaoCentro”中,但是如果在创建“Eliel_FuncionarioAlocacaoCentro”时发生错误,它不会进行回滚,以免也创建“Eliel_FuncionarioAlocacao”,什么是我在这个观点上做错了?
from .serializers import FuncionarioAlocacaoSerializer
from auditlog.context import set_actor
from client.app_eliel.models import Eliel_FuncionarioAlocacao, Eliel_FuncionarioAlocacaoCentro
from django.db import transaction
from microservices.serializers import ActorSerializer
from oauth2_provider.contrib.rest_framework import OAuth2Authentication, TokenHasReadWriteScope
from project_datafit.utils import log_error
from rest_framework import status
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
import json
import re
@api_view(['POST'])
@authentication_classes([OAuth2Authentication])
@permission_classes([TokenHasReadWriteScope])
def funcionarioAlocacao_create_api(request):
actor_serializer = ActorSerializer(data=request.data)
funcionarioAlocacao_serializer = FuncionarioAlocacaoSerializer(data=request.data)
try:
actor_serializer.is_valid(raise_exception=True)
funcionarioAlocacao_serializer.is_valid(raise_exception=True)
actor = actor_serializer.validated_data['actor']
matricula = funcionarioAlocacao_serializer.validated_data['matricula']
data_inicio = funcionarioAlocacao_serializer.validated_data['data_inicio']
data_fim = funcionarioAlocacao_serializer.validated_data['data_fim']
obs = funcionarioAlocacao_serializer.validated_data.get('obs')
centros_data = funcionarioAlocacao_serializer.validated_data.get('centros', [])
with transaction.atomic():
with set_actor(actor):
try:
funcionarioAlocacao = Eliel_FuncionarioAlocacao(Matricula=matricula, DataInicio=data_inicio, DataFim=data_fim, Obs=obs)
funcionarioAlocacao.save()
for centro_data_str in centros_data:
centro_data = json.loads(centro_data_str)
centro = centro_data.get('centro')
porcentagem = centro_data.get('porcentagem')
Eliel_FuncionarioAlocacaoCentro.objects.create(
IdAlocacao=funcionarioAlocacao,
CodCentro=centro,
Peso=porcentagem
)
return Response({'success': 'Alocação feita com sucesso'}, status=status.HTTP_200_OK)
except Exception as e:
log_error(request.path, str(e), actor)
return Response({'error': 'Erro ao alocar funcionário'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
except ValidationError as e:
error_message = str(e.detail)
error_message = re.search(r"ErrorDetail\(string='([^']*)'", error_message).group(1)
return Response({'error': error_message}, status=status.HTTP_400_BAD_REQUEST)
我希望原子事务在发生错误时回滚,创建两个模型元素,或者如果出现错误则不创建任何元素
请注意,要回滚事务,您需要在某处引发错误!
由于您捕获了所有异常,因此它没有按应有的方式工作!根据您的要求,它可能会有所不同,但可能类似于:
From rest_framework.serializers import ValidationError
然后在异常块中执行以下操作:
raise ValidationError("some errors")
那么您的 API 的状态代码将为 400(同样可能是其他一些异常,但必须引发它才能回滚事务),并且我假设您的所有事务都将回滚。