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 datetime import timedelta
from django.contrib.auth.models import AnonymousUser
from account.models import User
class DetailSerializer(serializers.ModelSerializer):
@@ -323,12 +324,31 @@ class DynamicProductSerializer(serializers.ModelSerializer):
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):
user = UserCommentSerializer(read_only=True)
user_rating = serializers.SerializerMethodField()
class Meta:
model = CommentModel
exclude = ('review_status', )
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 Meta:
+23 -1
View File
@@ -590,8 +590,30 @@ class CommentView(APIView):
).select_related('user')
paginator = self.pagination_class()
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(
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)
def post(self, request, slug):