개발자 99% 커뮤니티에서 수다 떨어요!
(velog를 개설해 봤습니다.)
간단하게 이야기합니다.(간단하지 않을수도 있음...제가 문장력이 딸려서)
Airbnb 클론의 Reservation 모델을 예로 들었습니다.(강의에서는 날짜 모델은 따로 떨어져있는데 여기에선 간소화시켰습니다.)
결론부터 말하면 모델의 class Meta 정의에서 constraints를 정의해서 그 안에서 models.UniqueConstraint로 fields에 묶어서 Unique화 시킬 필드를 나열하고 그 유니크 키에 대한 이름을 적어주면 됩니다.(제 이상한 문장을 읽으시는 것보다 위의 코드를 보시는 게 좋습니다.)
한 문장으로 정리하자면,
"만약에 user1과 user2가 있는데 user1이 2021년 1월 9일에 대한 예약을 이미 생성한 경우, 그 유저는 실수로 같은 날에 예약을 할 수 없다." 입니다. 마치 배민에서 2021년 1월 9일에 치킨을 주문했는데 그 날 실수로 또 치킨을 주문하려 한다고 할 때 그 참사를 막는 것과 같습니다.
Airbnb의 가정으로 돌아가서 1월 9일에 user1이 예약했다면 user2가 같은 방에 같은 날짜에 예약을 하면 안 되므로(그런 대참사가...) 그것은 위의 reserve_date 필드의 unique=True에서 막아줍니다.
에러는 모두 IntegrityError가 발생하며 date만의 유니크의 경우 reserve_date가 겹친다는 에러가 표시되고, constraints에 걸리는 경우 user_id와 reserve_date가 겹쳐서 오브젝트 생성이 불가능하다는 에러를 내게 됩니다.
어느 쪽이든 이미 존재하는 예약이라는 뜻이니 views.py에서 IntegrityError에 대한 예외처리만 해주면 끝일 것 같네요.
출처 : 저의 Velog 첫 글
(제가 작성했습니다.)