from rest_framework import serializers from .models import League, Player, PlayerGameLog, PlayerSeasonStat, Team class LeagueSerializer(serializers.ModelSerializer): class Meta: model = League fields = ["name", "code", "region", "country"] class TeamSerializer(serializers.ModelSerializer): class Meta: model = Team fields = ["name", "country"] class PlayerSeasonStatSerializer(serializers.ModelSerializer): class Meta: model = PlayerSeasonStat fields = [ "games_played", "minutes_per_game", "points_per_game", "assists_per_game", "rebounds_per_game", "steals_per_game", "blocks_per_game", "turnovers_per_game", "field_goal_percentage", "three_point_percentage", "free_throw_percentage", "efficiency_rating", "true_shooting_percentage", "usage_percentage", "total_points", "total_assists", "total_rebounds", ] class PlayerGameLogSerializer(serializers.ModelSerializer): class Meta: model = PlayerGameLog fields = [ "game_date", "opponent", "points", "assists", "rebounds", "steals", "blocks", "turnovers", "efficiency_rating", ] class PlayerListSerializer(serializers.ModelSerializer): name = serializers.CharField(read_only=True) league = serializers.SerializerMethodField() team = serializers.SerializerMethodField() stats = serializers.SerializerMethodField() class Meta: model = Player fields = [ "id", "name", "position", "role", "birth_year", "height_cm", "weight_kg", "nationality", "league", "team", "stats", ] def get_league(self, player: Player) -> dict | None: stat = self._current_stat(player) return LeagueSerializer(stat.league).data if stat else None def get_team(self, player: Player) -> dict | None: stat = self._current_stat(player) team = stat.team if stat else player.current_team return TeamSerializer(team).data if team else None def get_stats(self, player: Player) -> dict | None: stat = self._current_stat(player) return PlayerSeasonStatSerializer(stat).data if stat else None def _current_stat(self, player: Player) -> PlayerSeasonStat | None: prefetched = getattr(player, "prefetched_stats", None) if prefetched is not None: return prefetched[0] if prefetched else None return player.season_stats.select_related("league", "team", "season").first() class PlayerDetailSerializer(PlayerListSerializer): best_game = serializers.SerializerMethodField() worst_game = serializers.SerializerMethodField() class Meta(PlayerListSerializer.Meta): fields = PlayerListSerializer.Meta.fields + ["external_source", "profile_url", "best_game", "worst_game"] def get_best_game(self, player: Player) -> dict | None: game = player.game_logs.order_by("-efficiency_rating", "-points").first() return PlayerGameLogSerializer(game).data if game else None def get_worst_game(self, player: Player) -> dict | None: game = player.game_logs.order_by("efficiency_rating", "points").first() return PlayerGameLogSerializer(game).data if game else None