from rest_framework import serializers from .models import Coaster class CoasterSerializer(serializers.ModelSerializer): creator_username = serializers.ReadOnlyField(source='creator.username') rating_avg = serializers.SerializerMethodField() rating_count = serializers.SerializerMethodField() user_rating = serializers.SerializerMethodField() class Meta: model = Coaster fields = [ 'id', 'creator_username', 'challenge', 'name', 'anchors', 'acceleration_strips', 'rating_avg', 'rating_count', 'user_rating', 'created_at', 'updated_at', ] read_only_fields = ['id', 'creator_username', 'created_at', 'updated_at'] def get_rating_avg(self, obj): ratings = list(obj.ratings.values_list('rating', flat=True)) if not ratings: return None return round(sum(ratings) / len(ratings), 2) def get_rating_count(self, obj): return obj.ratings.count() def get_user_rating(self, obj): request = self.context.get('request') if not request or not request.user.is_authenticated: return None rating = obj.ratings.filter(user=request.user).first() return rating.rating if rating else None