반응형
유저가 예약을 하면 bookings에 레코드가 생성되고
해당 예약에 해당되는 승객이 생기고
각 승객별로 티켓이 생성된다.
booking = Booking.objects.create(
...
)
passenger_list = [Passenger(
...
for passenger in passengers]
Passenger.objects.bulk_create(passenger_list)
[Ticket.objects.create(
...
for passenger in Passenger.objects.filter(booking_id = booking.id) for detail in flight_details]
그래서 순서대로 Booking, Passenger, Ticket객체를 생성하는데
이 과정은 하나의 트랜잭션이다. 그래서 예약-승객-티켓 생성이 전부 실행되거나 전부 실행되지 않아야 한다.
Passenger를 만드는 중간에 에러가 난다면 그전에 만들어졌던 Booking을 다시 없던걸로 되돌려야 하는데 장고에서 transaction을 지원해준다.
사용하기
from django.db import transaction
임포트를 해주고
with transaction.atomic():
트랜잭션을 이 아래 넣어준다.
그러면 중간에 에러가 발생해서 전체 트랜잭션이 실행되지 않으면
중간까지 실행됐던 작업이 롤백되어 원자성 유지가 가능하게 된다.
from django.db import transaction
class BookingView(View):
@check_access
def post(self, request):
try:
with transaction.atomic():
...
booking = Booking.objects.create(
...
)
passenger_list = [Passenger(
...
for passenger in passengers]
Passenger.objects.bulk_create(passenger_list)
[Ticket.objects.create(
...
for passenger in Passenger.objects.filter(booking_id = booking.id) for detail in flight_details]
return JsonResponse({'message' : 'SUCCESS'}, status = 200)
except ...
반응형
'wecode' 카테고리의 다른 글
마이허니트립 | 프로젝트 회고 (0) | 2022.08.29 |
---|---|
마이허니트립 | 예약목록 api : annotate를 이용한 정렬 (0) | 2022.08.22 |
마이허니트립 | 예약페이지 승객정보 bulk_create (0) | 2022.08.14 |
마이허니트립 | 예약상태 지정에 Enum사용하기 (0) | 2022.08.07 |
마이허니트립 | 카카오 로그인 api : 카카오 인가코드로 토큰발급받기 (0) | 2022.08.05 |