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 할 수 있다
'airbnb clone coding' 카테고리의 다른 글
[Django] 13. Code Challenge (0) | 2024.08.28 |
---|---|
[Django] 12. USERS API (0) | 2024.08.28 |
[Django] 11_2. REST API: Rooms (0) | 2024.08.12 |
[Django] 11_1. REST API: amenities / perks (0) | 2024.08.06 |
[Django] 10. Django REST Framework: JsonResponse / api_view / Serializer / ViewSet (0) | 2024.07.23 |