[0625] drf : review 불러오기

nikevapormax·2022년 6월 27일
0

TIL

목록 보기
59/116
post-custom-banner

Django Rest Framework

마지막 리뷰와 평균 평점 불러오기

  • 사용자가 올린 product에는 리뷰와 평점이 달려 있다. 처음에는 모든 리뷰들을 다 불러왔었는데, 마지막 리뷰와 평점들의 평균을 불러오는 쪽으로 방향을 바꾸었다.
  • 처음에 모든 리뷰를 불러올 때는 ReviewSerializer를 통해 그냥 불러왔으면 되었으나, 내가 원하는 정보를 커스텀해 가져와야 해 아래와 같이 코드를 작성했었다.
class ProductSerializer(serializers.ModelSerializer):
    last_review = serializers.SerializerMethodField()
    avg_rate = serializers.SerializerMethodField()
        
    def get_last_review(self, obj):
        review_list = []
        
        for reviews in obj.review_set.all():
            if reviews.content:
                review_list.append(reviews.content)
        
        if len(review_list) != 0:
            return review_list[-1]
        
        return ""
        
    def get_avg_rate(self,obj):
        review_list = []
        
        for reviews in obj.review_set.all():
            if reviews.content:
                review_list.append(reviews.rate)
        
        if len(review_list) != 0:
            return sum(review_list) / len(review_list)
        
        return 0
    
    class Meta:
        model = ProductModel
        fields = ["user", "title", "thumbnail", "desc", "created_at", "exposure_start",
                  "exposure_end", "price", "updated_at", "activate", "last_review", "avg_rate"]
  • 코드를 작성하면서도 뭔가 마지막 리뷰와 평점을 한 번에 불러올 수 있을 것 같다는 생각이 들고 코드가 좀 더러워 보였다.
  • 위의 문제를 아래와 같이 해결하였다.
class ProductSerializer(serializers.ModelSerializer):
    reviews = serializers.SerializerMethodField()
    
    def get_reviews(self, obj):
        reviews = obj.review_set
        return {
            "last_comment": ReviewSerializer(reviews.last()).data,
            "average_rate": reviews.aggregate(avg = Avg("rate"))
        }
    
    class Meta:
        model = ProductModel
        fields = ["user", "title", "thumbnail", "description", "exposure_start", "exposure_end", "price", "activate", "reviews"]
  • aggregate 참고 문서 : 장고 공홈
  • last 참고 문서 : 링크텍스트
    • 쿼리셋에서 사용할 수 있는 다른 정보들도 포함
profile
https://github.com/nikevapormax
post-custom-banner

0개의 댓글