마이허니트립 | 예약페이지 승객정보 bulk_create

2022. 8. 14. 16:38·wecode
반응형

예약 관련 데이터베이스 테이블

예약을 하면 생기는 데이터

로그인을 하고 예약을 하면 해당 유저에게 예약이라는 테이블이 생기고,

같은 예약 안에 승객이 한명 혹은 여러명 생기고

한 승객당 하나(편도) 혹은 두개(왕복)의 티켓이 생기게 된다.

 

예약 생성

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
'wecode' 카테고리의 다른 글
  • 마이허니트립 | 예약목록 api : annotate를 이용한 정렬
  • 마이허니트립 | 예약 api transaction.atomic() 적용
  • 마이허니트립 | 예약상태 지정에 Enum사용하기
  • 마이허니트립 | 카카오 로그인 api : 카카오 인가코드로 토큰발급받기
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
마이허니트립 | 예약페이지 승객정보 bulk_create
상단으로

티스토리툴바