
예약을 하면 생기는 데이터
로그인을 하고 예약을 하면 해당 유저에게 예약이라는 테이블이 생기고,
같은 예약 안에 승객이 한명 혹은 여러명 생기고
한 승객당 하나(편도) 혹은 두개(왕복)의 티켓이 생기게 된다.
예약 생성
booking = Booking.objects.create(
booker_name = data['booker_name'],
booker_email = data['booker_email'],
booker_mobile_number = data['booker_mobile_number'],
booking_status = BookingStatus.objects.get(id = upcoming),
user = user,
booking_number = uuid4()
)
바디에 받아온 데이터들로 예약을 먼저 생성한다.
승객정보 생성
passenger_list = [
Passenger(
first_name = passenger['first_name'],
last_name = passenger['last_name'],
gender = passenger['gender'],
birthday = passenger['birthday'],
booking_id = booking.id
)for passenger in passengers]
Passenger.objects.bulk_create(passenger_list)
해당 예약을 참조하는 승객들을 생성한다.
승객정보처럼 같은 형식의 데이터를 여러개 생성할 때
bulk_create를 이용하면 여러 정보를 db에 저장하면서도 쿼리를 1번만 호출하는 효과가 있다.
티켓 생성
[Ticket.objects.create(
tichet_number = uuid4(),
passenger_id = passenger.id,
booking_id = booking.id,
ticket_status_id = TicketStatus.objects.get(id = ticket_confirm).id,
flight_detail = FlightDetail.objects.get(id = detail)
)for passenger in Passenger.objects.filter(booking_id = booking.id) for detail in flight_details]
flight_details에는 편도면 하나, 왕복이면 두 개의 비행 상세정보를 가진다.
한 예약의 승객들은 모두 같은 여행 여정을 가진다.
그래서 이중으로 포문을 돌리면서 각 승객당 모두 같은 티켓을 생성해준다.
주의할점
for passenger in passenger_list
승객에 대한 포문을 처음에 위처럼 돌렸는데
passenger_id cannot be null이라는 에러메세지가 나온다.
위에서 bulk_create로 승객정보를 생성할 때 id를 넣지 않았는데, id값은 자동생성이기 때문에
Passenger.objects.bulk_create(passenger_list)
이 명령어가 실행되면 데이터베이스에는 id값을 가지고 승객들의 정보가 잘 들어가게 된다.
그런데 passenger_list에는 데이터베이스에 저장된 승객 객체들이 담긴게 아니다.
passenger_list를 만들어서 해당 리스트를 데이터베이스에 저장하고, 데이터베이스의 passengers 테이블의 id컬럼에는 값들이 있지만
passenger_list = [
Passenger(
first_name = passenger['first_name'],
last_name = passenger['last_name'],
gender = passenger['gender'],
birthday = passenger['birthday'],
booking_id = booking.id
)for passenger in passengers]
passenger_list는 그냥 위의 리스트이다.
그래서 passenger_list를 포문을 돌리면서 나오는 각 passenger에는 id라는 속성이 없고
티켓을 만들면서 passenger_id = passenger.id를 하면 들어가는 값이 없어서 에러가 나는 것이다.
그래서 데이터베이스에 있는 방금 저장된 승객정보를 불러와서 그 안에서 passenger를 뽑아내는 코드로 수정을 했다.
for passenger in Passenger.objects.filter(booking_id = booking.id)
참고
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#bulk-create
'wecode' 카테고리의 다른 글
| 마이허니트립 | 예약목록 api : annotate를 이용한 정렬 (0) | 2022.08.22 |
|---|---|
| 마이허니트립 | 예약 api transaction.atomic() 적용 (0) | 2022.08.17 |
| 마이허니트립 | 예약상태 지정에 Enum사용하기 (0) | 2022.08.07 |
| 마이허니트립 | 카카오 로그인 api : 카카오 인가코드로 토큰발급받기 (0) | 2022.08.05 |
| 마이허니트립 | 카카오 로그인 api : 카카오 토큰으로 유저정보 받아서 회원가입, 로그인 시키기 (0) | 2022.08.04 |
