본문 바로가기
airbnb clone coding

[Django] 11_2. REST API: Rooms

by busybee-busylife 2024. 8. 12.
반응형

GET 

 

 Authentication

만약 데이터베이스의 모든 room을 가지고 오고 싶다면:

/rooms에서 GET request

-> 모든 room을 가져와서 serialize

-> room을 reponse로 리턴 

 

새 room을 만드려면:

authenticate 과정이 필요 & 만드는 사람이 host 이어야 & 카테고리도 지정 & 어떤 amenity를 가지고 있는지 

즉, serializer 간의 relationship을 만들 줄 알아야! 

 

1) rooms > views.py 에서 Rooms(APIView) 클래스 만들기 

2) rooms > urls.py 의 urlpatterns 에 빈 path 만들기 

3) rooms > serializers.py 에서 RoomSerializer(ModelSerializer) 클래스 만들기 

4) rooms > views.py 에서 Rooms(APIView) 클래스 수정 

 

depth = 1 

: 모든 관계를 확장, 커스터마이징 불가 

-> 나만의 serializer를 만들어야 

현재는 owner, category, amenities 등이 그냥 숫자로 들어가있다 

-> rooms > serializers.py 의 RoomSerializer(ModelSerializer) 클래스에서 depth 추가 

-> relationship이 확장됨 

depth=1: too much info! 

개별 room의 상세페이지가 아닌 이상 위와 같은 정보는 너무 많다 

보여지는 user 정보 커스터마이징하기

1) users > serializers.py 파일 만들어 TinyUserSerializer 클래스 만들기(제공할 정보 지정)

2) rooms > serializers.py 의 RoomDetailSerializer 클래스에서 owner를 위 클래스로 정의 

 

==> Solution: 두개의 serializer를 만들어 각각 진행한다 

1) room detail: 상세 정보 제공

2) room list: 여러개의 room들을 나열(RoomListSerializer 클래스) 


POST request: room 생성하기 

1) rooms > views.py 의 Rooms(APIView) 클래스에서 post 함수 생성

   # 무언가를 생성하기 위해서 데이터는 serializer를 통해서 전달되어야 한다 

   # serializer는 validation 해준다(유저가 보낸 데이터로 방을 생성할 수 있는지 확인) 

  !주의! room을 생성할 때 "owner" 정보를 입력할 수 있게 하면 안된다! 

  (내가 올린 room을 다른 사람이 자기 껄로 바꿀 수 있게 된다) 

  -> owner를 read_only=True로 설정: room 생성시 serializer는 owner에 대한 정보를 요구하지 X 

       대신 request.data와 room의 owner 정보를 저절로 받아서 room이 생성되도록 

       Authenticated: 해당 room을 만든 user

      Unauthenticated: 해당 room을 만들지 않은 user 


Transaction 

: Django에서는 기본적으로 모든 쿼리는 즉시 데이터베이스에 반영된다

하지만, Transaction을 사용하면 관련있는 부분의 모든 코드가 성공해야 한 세트가 만들어진다 

(하나라도 실패하면 모든 쿼리가 실패한다) 

 

 

e.x. 

user가 room을 생성한 후 amenities를 보내는 경우 

지금은 만약 기존에 존재하지 않는 amenity를 보낸다면 room 자체가 생성되지 않음에도 불고 id를 잡아먹는다

(실제 생성되지 않음에도 id가 할당됨)

하지만 Transaction을 사용하면 id를 낭비(?)하지 않는다(애초에 생성되지 않았기 때문) 

 


Delete Rooms

rooms > views.py 의 RoomDetail 클래스에서 delete 메서드 추가 

반응형