from rest_framework import serializers from .models import * from exercise.models import Exercise from exercise.serializers import ExerciseSerializer class SupersetExerciseSerializer(serializers.ModelSerializer): exercise = serializers.SerializerMethodField() unique_id = serializers.SerializerMethodField() class Meta: model = SupersetExercise fields = '__all__' def get_exercise(self, obj): try: exercise = obj.exercise except (Exercise.DoesNotExist, AttributeError): return None if exercise is None: return None return ExerciseSerializer(exercise, many=False).data def get_unique_id(self, obj): return f"{obj.pk}-{obj.superset_id}" if hasattr(obj, 'superset_id') else str(obj.pk) class SupersetSerializer(serializers.ModelSerializer): """Serializer for Superset with nested exercises. For optimal performance, callers should prefetch related data: Superset.objects.prefetch_related( 'superset_exercises__exercise__exercise_muscle_exercise__muscle', 'superset_exercises__exercise__workout_exercise_workout__equipment', ) """ exercises = serializers.SerializerMethodField() class Meta: model = Superset fields = '__all__' def get_exercises(self, obj): if obj.pk is None: return [] # Use prefetched data if available via superset_exercises related manager objs = obj.superset_exercises.all().order_by('order') return SupersetExerciseSerializer(objs, many=True).data