본문 바로가기
airbnb clone coding

[Django] 11_3. REST API: Customizing Serializers

by busybee-busylife 2024. 8. 26.
728x90

Room에 대한 리뷰 만들기

rooms > models.py 의 Room 클래스의 rating 메서드를

rooms > serializers.py 에서 불러와서 사용하기(serializer field에서)

 

rooms > serializers.py 의 RoomDetailSerializer 클래스에서 

rating을 만들고 + get_rating 메서드(이름 지키기!) 생성

 

RoomListSerializer 클래스에도 rating + get_rating 메서드 추가 


Context

특정 상황에서 필요한 데이터를 포함하고 있는 사전(dictionary) 형태의 객체

주로 템플릿 엔진, 시리얼라이저, 또는 뷰에서 사용되며, 이 Context 객체를 통해 템플릿이나 시리얼라이저에서 필요한 추가적인 데이터나 변수를 전달할 수 있다

 

User에 대한 리뷰 만들기

Context: Serializer에 외부 세계에 대한 정보를 보내야 하는 경우 매우 유용 

 

e.x.

rooms > views.py 의 RoomDetail클래스: RoomDetailSerializer에서 context를 적용

이제 다른 메서드에서도 이 context에 접근할 수 있다(self.context만 추가하면 ok) 

Serializer에 context를 전달해야한다!! 


Reverse Serializer

 

Reverse Accesor

: 모델A가 모델B에 대해 foreign key를 가지고 있다면, 모델B는 자동적으로 'A_set'이라는 reverse accesor를 받는다.

  'A_set'은 모델B에게 모델B를 가리키고 있는 모든 모델A들을 준다. 

 

e.x. 하나의 리뷰는 foreign key를 이용하여 하나의 user와 room을 가진다

 

review serializer 생성하기 

: 하나의 room에 대해 만들어진 모든 리뷰 보여주기 

1) reviews > serializers.py 파일 만들어서 ReviewSerializer 클래스 생성 

2) rooms > serializers.py 의 RoomDetailSerializer 클래스에서 reviews 필드 추가 

문제점: 위 방식은 데이터베이스를 너무 많이 소모 & 모든 리뷰가 room 페이지에 다 나타난다 

 

해결방안: 해당 room에 대한 리뷰를 모아놓은 새로운 URL을 만든다(이렇게 해서 10개씩 보여준다) 

1) rooms > urls.py 의 urlpatterns에서 새로운 path 추가 

2) rooms > views.py 에서 새로운 view 생성: RoomReviews(APIView) 클래스 


File Uploads

POST: 사진 업로드하기 

DELETE: /rooms/<pk>/photos/<photo_pk>

 

1) rooms > urls.py 의 urlpatterns에 path 추가 

2) rooms > views.py 에서 RoomPhotos(APIView) 클래스 추가 

3) config > settings.py 에서 MEDIA_ROOT = 'uploads'(폴더명) 생성

이제 사진을 추가하면 'uploads' 폴더가 만들어지면서 사진이 그 안에 저장된다 

4) config > settings.py 에서 MEDIA_URL 생성 

5) config > urls.py 에 static(settings.MEDIA_URL) 추가 

 

**위 방법은 보안 위험이 있어 권장되지 않음 ** 

모든 유저가 올리는 파일에 서버 디스크 공간을 할애하는 것은 위험하다 

(무슨 파일을 업로드할 지 알 수 없다) 

 

-> 대신 이 파일들을 다른 서버에 업로드 & 해당 파일의 url만 장고에 전달한다!

(이제 파일이 장고와 직접 touch하지 않는다) 

1) medias > models.py 의 Photo, Video 클래스에서 file을 __.URLField()로 변경

2) medias > serializers.py 파일 만들어서 PhotoSerializer 클래스 만들기 

3) rooms > views.py 의 RoomPhotos 클래스 완성(사진을 업로드하면 해당 room과 연결되는지 확인)


Permission Classes

: 사용자가 API 요청을 할 때, 그 사용자가 해당 요청을 할 권한이 있는지를 확인하는 역할

ex) 사진을 삭제하는 경우 

업로드할때 이미 rooms > views.py의 RoomPhotos 클래스의 post 매서드에서 이미 인증확인함(is_authenticated) 

그런데 삭제할 때 medias > views.py의 PhotoDetail 클래스의 delete 메서드에서 또 인증을 확인함 

매번 이렇게 중복확인할 필요없이 APIView의 프로퍼티를 변경할 수 있다! 

 

e.x.

이미 업로드된 사진을 삭제하는 경우,

rooms>views.py vs. medias > views.py 중 어느 파일에서 해야할까?? 

 

1) config > urls.py 에서 path 추가 

2) medias > views.py 파일에서 PhotoDetail(APIView) 클래스 만들기

3) medias > urls.py 파일 만들어 urlpatterns 에서 path 추가 

4) medias > views.py 의 PhotoDetail(APIView) 클래스에서 permission_classes 추가 


Reviews

 

PhotoSerializer를 RoomSerializer에 추가하기 

 

medias > models.py 의 Photo 클래스는 room을 가리키는 foreign key를 사용하고 있다

즉, room은 reverse accesor 혹은 related_name을 이용해서 자기를 가리키는 모든 사진들을 가져올 수 있다

(room은 자신을 가리키는 모든 사진이 있는 photos property가 있다) 

 

1) medias > models.py의 Photo, Video 클래스에서 room, experience에 각각 related_name="photos" 추가 

2) rooms > serializers.py의 RoomDetailSerializer, RoomListSerializer 클래스에 photos 추가 

 

 

유저가 리뷰를 POST 할 수 있게 하려면

1) reviews > serializers.py 의 ReviewSerializer 클래스에서 user 생성(read_only=True) 

2) rooms > views.py 의 RoomReviews(APIView) 클래스에서 post 메서드 생성 

 


Wish List

1) wishlists > urls.py 파일을 생성하여 urlpatterns를 만든다

2) wishlists > views.py 에서 Wishlists(APIView) 클래스 생성

3) config > urls.py 의 urlpatterns에 path 추가 

4) wishlists > serializers.py 파일 생성하여 WishlistSerializer 클래스 만든다 

5) wishlists > views.py 에서 WishlistDetail 클래스 생성


Bookings

1) rooms > urls.py 의 urlpatterns에 bookings path 추가 

2) rooms > views.py 에서 RoomBookings(APIView) 클래스 생성

3) bookings > serializers.py 파일 생성하여 PublicBookingSerializer 클래스 만든다 

 

Customized Validation 만들기

- serializer(CreateRoomBookingSerializer클래스) 안에 customized validation 메서드를 만든다 

- 이때 메서드 이름을 validate_ooo: ㅇㅇㅇ에 대한 validation이 이루어진다 

- 모든 field를 동시에 validate 할 수 있다 

 

 

 

 

728x90