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 참고 문서 : 링크텍스트
- 쿼리셋에서 사용할 수 있는 다른 정보들도 포함