如何在Django REST Framework中单独展示review_count字段
解决方案
首先纠正一个小问题:你期望的响应结构不是合法JSON(数组中不能直接放置"review_count": 2这类键值对),更规范的结构应该是包含总数和评论列表的对象,示例如下:
{ "review_count": 2, "reviews": [ {"user": "don sebastian","rating": 3.9,"review": "Rating for pendant 1 by Don","created_at": "2022-11-27","updated_at": "2022-11-27"}, {"user": "Jackson Patrick Gomez","rating": 4.5,"review": "cool review Pendant 1","created_at": "2022-11-27","updated_at": "2022-11-29"} ] }
如果坚持要类似数组的结构(不推荐),可以调整为[{"review_count":2}, {...}, {...}]的形式,不过规范的对象结构更利于前端解析。
以下是具体实现步骤:
1. 修改Serializer.py
移除序列化器中的review_count字段,让每条评论仅返回核心内容:
class ReviewSerializer(ModelSerializer): user = SerializerMethodField() class Meta: model = ReviewRatings fields = ["user", "rating", "review", "created_at", "updated_at"] def get_user(self, obj): return f"{obj.user.first_name} {obj.user.last_name}"
2. 修改Views.py
在视图中单独计算评论总数,再与序列化后的评论列表组合成目标响应结构:
class ShowReviews(APIView): def get(self, request, *args, **kwargs): product_slug = self.kwargs['product_slug'] rating = request.GET.get('rating') reviews = ReviewRatings.objects.filter(product__slug=product_slug) review_count = reviews.count() if rating == 'lowest': reviews = reviews.order_by('rating') elif rating == 'highest': reviews = reviews.order_by('-rating') if not reviews: return Response({"error": "No reviews for this product yet"}, status=404) serializer = ReviewSerializer(reviews, many=True) # 构造规范的响应结构 response_data = { "review_count": review_count, "reviews": serializer.data } # 若坚持使用数组结构,替换为以下代码 # response_data = [{"review_count": review_count}] + serializer.data return Response(response_data, status=status.HTTP_200_OK)
实现说明
- 序列化器不再处理
review_count,避免每条评论携带重复的总数数据 - 视图层单独计算总数后,将总数与评论列表组合,既满足需求又符合JSON规范
内容的提问来源于stack exchange,提问作者Sins97
相关产品推荐
相关产品推荐

