Improve search quality, ORM efficiency, and filter consistency

This commit is contained in:
Alfredo Di Stasio
2026-03-10 14:37:01 +01:00
parent ceff4bc42c
commit a1ae380fd5
12 changed files with 375 additions and 14 deletions

View File

@ -43,6 +43,8 @@ class PlayerListSerializer(serializers.ModelSerializer):
nationality = serializers.CharField(source="nationality.name", allow_null=True)
nominal_position = serializers.CharField(source="nominal_position.code", allow_null=True)
inferred_role = serializers.CharField(source="inferred_role.name", allow_null=True)
origin_competition = serializers.CharField(source="origin_competition.name", allow_null=True)
origin_team = serializers.CharField(source="origin_team.name", allow_null=True)
class Meta:
model = Player
@ -53,6 +55,8 @@ class PlayerListSerializer(serializers.ModelSerializer):
"nationality",
"nominal_position",
"inferred_role",
"origin_competition",
"origin_team",
"height_cm",
"weight_kg",
"dominant_hand",
@ -88,6 +92,8 @@ class PlayerDetailSerializer(serializers.ModelSerializer):
nationality = serializers.CharField(source="nationality.name", allow_null=True)
nominal_position = serializers.CharField(source="nominal_position.name", allow_null=True)
inferred_role = serializers.CharField(source="inferred_role.name", allow_null=True)
origin_competition = serializers.CharField(source="origin_competition.name", allow_null=True)
origin_team = serializers.CharField(source="origin_team.name", allow_null=True)
age = serializers.SerializerMethodField()
aliases = serializers.SerializerMethodField()
season_stats = serializers.SerializerMethodField()
@ -102,6 +108,8 @@ class PlayerDetailSerializer(serializers.ModelSerializer):
"nationality",
"nominal_position",
"inferred_role",
"origin_competition",
"origin_team",
"height_cm",
"weight_kg",
"dominant_hand",

View File

@ -5,7 +5,13 @@ from rest_framework.throttling import AnonRateThrottle, UserRateThrottle
from apps.competitions.models import Competition, Season
from apps.players.forms import PlayerSearchForm
from apps.players.models import Player
from apps.players.services.search import apply_sorting, base_player_queryset, filter_players
from apps.players.services.search import (
METRIC_SORT_KEYS,
annotate_player_metrics,
apply_sorting,
base_player_queryset,
filter_players,
)
from apps.teams.models import Team
from .permissions import ReadOnlyOrDeny
@ -38,7 +44,10 @@ class PlayerSearchApiView(ReadOnlyBaseAPIView, generics.ListAPIView):
queryset = base_player_queryset()
if form.is_valid():
queryset = filter_players(queryset, form.cleaned_data)
queryset = apply_sorting(queryset, form.cleaned_data.get("sort", "name_asc"))
sort_key = form.cleaned_data.get("sort", "name_asc")
if sort_key in METRIC_SORT_KEYS:
queryset = annotate_player_metrics(queryset)
queryset = apply_sorting(queryset, sort_key)
else:
queryset = queryset.order_by("full_name", "id")
return queryset
@ -50,6 +59,8 @@ class PlayerDetailApiView(ReadOnlyBaseAPIView, generics.RetrieveAPIView):
"nationality",
"nominal_position",
"inferred_role",
"origin_competition",
"origin_team",
).prefetch_related("aliases")