AI 웹 개발 과정/팀 프로젝트

최종 프로젝트 - API 구현 (리뷰 리스트 조회, 리뷰 상세 조회)

만 기 2022. 7. 14. 16:42

 

1. 리뷰 리스트 조회 기능 구현 

리뷰 리스트 페이지에서 사용자들이 올린 리뷰글을 최신순으로 간략하게 보여주는 것이 목적.

API 문서를 꼭 참조할 것.

 

review/views.py

# 리뷰 기능
class ReviewView(APIView):
    permission_classes = [permissions.AllowAny]
    authentication_classes = [JWTAuthentication]

    # 리뷰 리스트 조회
    def get(self, request):
        reviews = Review.objects.all().order_by('-id')

        reviews_serializer = ReviewSerializer(reviews, many=True).data

        return Response(reviews_serializer, status=status.HTTP_200_OK)
  • Review 모델에 저장된 object 들을 모두 가져오는데, id가 가장 최근인 순서로 가져온다. : .order_by('-id')
  • 가져온 object 들을 ReviewSerializer에 넣는데, 다수의 object 이므로 many=True 속성을 써준다.

 

review/serializers.py

# 리뷰 조회, 작성 시리얼라이저
class ReviewSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    images = serializers.SerializerMethodField()
    likes = serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.username

    def get_images(self, obj):
        image_obj = obj.reviewimage_set.all().first()
        image_data = {
            'review_id' : image_obj.review_id, 
            'order' : image_obj.order, 
            'image' : str(image_obj.image)
            }
        return image_data

    def get_likes(self, obj):
        query = (
            Q(posttype_id = 1) & 
            Q(post_id = obj.id)
        )
        likes_objs = Like.objects.filter(query)
        
        likes_count = likes_objs.count()
        return likes_count

    class Meta:
        model = Review
        fields = ['user', 'title', 'content', 
                  'created_at', 'images', 'likes']

 

1.1 SerializerMethodField()

SerializerMethodField() 를 사용하여 Custom Field를 만들 수 있다.

기본적으로 read-only 이므로 값을 저장하거나 수정할 때는 사용되지 않고 조회할 때만 사용한다.

인자로는 method_name 으로 해당 필드값에 대해 정의하는 함수의 이름을 넘겨준다.
지정해주지 않을 경우 default 로 get_<field_name> 으로 지정해줄 수 있다.

 

1.2 추가 참조 : Serializer fields 의 Core arguments

https://hyun-am-coding.tistory.com/entry/10-Serializer-fields

 

10. Serializer fields

Form 클래스의 각 필드는 데이터의 유효성을 검사할 뿐만 아니라 데이터를 "정리"하여 일관된 형식으로 정규화합니다. 시리얼라이저 필드는 기본 값과 내부 데이터 유형 간의 변환을 처리합니다.

hyun-am-coding.tistory.com

 

1.3 이미지 url값 딕셔너리에 넣을때 에러

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

참조: https://stackoverflow.com/questions/42339876/error-unicodedecodeerror-utf-8-codec-cant-decode-byte-0xff-in-position-0-in

 

error UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools An error occurred when compiling "process.py" on the above site. python tools/process.py --input_dir data -- operat...

stackoverflow.com

 

1.4 .count()

쿼리셋안에 오브젝트 갯수를 알 수 있다.

 

 


 

2. 리뷰 상세 조회 기능 구현 

리뷰 리스트 페이지에서 리뷰글을 누르면 상세 페이지로 이동하여 해당 리뷰의 내용을 상세하게 보여주는 것이 목적.

API 문서를 꼭 참조할 것.

 

review/views.py

# 리뷰 상세 기능
class ReviewDetailView(APIView):
    permission_classes = [permissions.AllowAny]
    authentication_classes = [JWTAuthentication]

    # 리뷰 상세보기
    def get(self, request, review_id):
        try:
            review_obj = Review.objects.all().get(id=review_id)
        except:
            return Response({"error": "존재하지 않는 게시글 입니다."}, status=status.HTTP_400_BAD_REQUEST)

        review_obj_serializer = ReviewDetailSerializer(review_obj).data
        return Response(review_obj_serializer, status=status.HTTP_200_OK)

url 에 해당 리뷰글 review_id 를 받아와서 Review 전체 오브젝트중 id가 review_id 인것을 get() 하는데 

'AI 웹 개발 과정 > 팀 프로젝트' 카테고리의 다른 글

nginx / gunicorn  (0) 2022.07.29
testcode 작성  (1) 2022.07.28
최종 프로젝트 - 모델링 / admin 작업  (0) 2022.07.14
최종 프로젝트 - 기획  (0) 2022.07.11
유화제작프로젝트 - KPT 회고  (0) 2022.07.06