comment rate added to serilizer and user detail added too
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user