comment rate added to serilizer and user detail added too

This commit is contained in:
Parsa Nazer
2026-05-18 14:42:15 +03:30
parent 99f82c88c6
commit c2bbe1b8ec
2 changed files with 43 additions and 1 deletions
+20
View File
@@ -3,6 +3,7 @@ from rest_framework import serializers
from django.utils import timezone from django.utils import timezone
from datetime import timedelta from datetime import timedelta
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from account.models import User
class DetailSerializer(serializers.ModelSerializer): class DetailSerializer(serializers.ModelSerializer):
@@ -323,12 +324,31 @@ class DynamicProductSerializer(serializers.ModelSerializer):
return serializer.data return serializer.data
class UserCommentSerializer(serializers.ModelSerializer):
"""Lightweight user serializer for comment author info"""
class Meta:
model = User
fields = ['id', 'first_name', 'last_name', 'profile_photo', 'phone']
class CommentSerializer(serializers.ModelSerializer): class CommentSerializer(serializers.ModelSerializer):
user = UserCommentSerializer(read_only=True)
user_rating = serializers.SerializerMethodField()
class Meta: class Meta:
model = CommentModel model = CommentModel
exclude = ('review_status', ) exclude = ('review_status', )
read_only_fields = ('review_status', 'product', 'user') read_only_fields = ('review_status', 'product', 'user')
def get_user_rating(self, obj):
"""
Get user's rating for this product using cached data to avoid N+1 queries.
The cache is provided by the CommentView.get() method.
"""
user_ratings_cache = self.context.get('user_ratings_cache', {})
# O(1) lookup in cache instead of database query
return user_ratings_cache.get(obj.user_id)
class BotProductSerializer(serializers.ModelSerializer): class BotProductSerializer(serializers.ModelSerializer):
class Meta: class Meta:
+23 -1
View File
@@ -590,8 +590,30 @@ class CommentView(APIView):
).select_related('user') ).select_related('user')
paginator = self.pagination_class() paginator = self.pagination_class()
paginated_comments = paginator.paginate_queryset(comments, request) paginated_comments = paginator.paginate_queryset(comments, request)
# OPTIMIZATION: Fetch all user ratings in a single query
# Get user IDs from paginated comments to only fetch ratings for displayed comments
user_ids = [comment.user_id for comment in paginated_comments]
# Single query to get all ratings for these users on this product
user_ratings = ProductRating.objects.filter(
product=product,
user_id__in=user_ids
).values_list('user_id', 'rating')
# Build cache dictionary for O(1) lookups in serializer
user_ratings_cache = {user_id: rating for user_id, rating in user_ratings}
# Pass cache to serializer context to avoid N queries
comments_ser = self.serializer_class( comments_ser = self.serializer_class(
instance=paginated_comments, many=True) instance=paginated_comments,
many=True,
context={
'request': request,
'user_ratings_cache': user_ratings_cache,
'product': product
}
)
return paginator.get_paginated_response(comments_ser.data) return paginator.get_paginated_response(comments_ser.data)
def post(self, request, slug): def post(self, request, slug):