Resumen

Calcular campos derivados en Django REST Framework con precisión y sin cambiar el modelo es sencillo con SerializerMethodField. Aquí verás cómo exponer la edad de un paciente desde su fecha de nacimiento, trabajar con timedelta y evitar errores típicos. Además, se muestra cómo extender la idea para la experiencia de un doctor.

¿Cómo usar serializermethodfield para calcular valores en el serializer?

SerializerMethodField permite derivar valores en el serializer usando la instancia completa del objeto. Si no indicas method_name, se aplica la convención get_nombreDelCampo (por ejemplo, get_age). Así accedes al objeto del modelo, lees sus campos y devuelves el valor calculado que aparecerá en el endpoint.

  • Usa SerializerMethodField para exponer campos calculados en el serializer.
  • Si omites method_name, se usa el método get_.
  • El parámetro del método es obj: la instancia del modelo (por ejemplo, Patient).
  • Toma date_of_birth del objeto para calcular la edad.
  • Importa date desde datetime: no uses datetime si el campo es de tipo date.
  • La resta date.today() - obj.date_of_birth retorna un timedelta.
  • Usa .days y divide entre 365 para obtener años como número.
  • Agrega el campo a fields para que se muestre en la respuesta.
  • Evita texto como “años” en la API: el formato es del front-end por soporte multiidioma.
  • Beneficio clave: no tocas el modelo, solo el serializer.

¿Qué pasos y código aplicar para calcular la edad?

from datetime import date
from rest_framework import serializers

class PatientSerializer(serializers.ModelSerializer):
    age = serializers.SerializerMethodField()  # también puedes usar method_name="get_age"

    def get_age(self, obj):
        # obj es una instancia de Patient con obj.date_of_birth (tipo date)
        age_days = (date.today() - obj.date_of_birth).days  # timedelta → días
        age_years = int(age_days / 365)  # años aproximados como número entero
        return age_years

    class Meta:
        model = Patient
        fields = ("date_of_birth", "age")  # incluye el campo calculado
  • Importa date para obtener date.today().
  • Resta fechas para obtener timedelta y extrae .days.
  • Divide entre 365 y retorna el número.
  • Incluye age en fields.

¿Qué errores comunes y buenas prácticas considerar?

Pequeños detalles marcan la diferencia: el tipo de dato, cómo acceder a días y dónde formatear el texto. Mantén el cálculo en el serializer y el idioma en el front-end.

  • No importes datetime cuando el campo es date: importa date.
  • No intentes dividir el timedelta directamente: usa .days primero.
  • No olvides agregar age a fields o no aparecerá en el endpoint.
  • No devuelvas cadenas tipo "45 años": devuelve el valor numérico.
  • Valida en el navegador el resultado tras guardar los cambios.
  • Aprovecha SerializerMethodField para no modificar el modelo.

¿Cómo calcular la experiencia de un doctor con un método similar?

La misma técnica sirve para un campo de experiencia en años, basado en la fecha en que el doctor empezó a trabajar. Solo cambia el campo de origen y el nombre del método.

from datetime import date
from rest_framework import serializers

class DoctorSerializer(serializers.ModelSerializer):
    experience = serializers.SerializerMethodField()

    def get_experience(self, obj):
        # Ajusta el nombre del campo según tu modelo, por ejemplo: obj.start_date
        start = obj.start_date  # fecha en que empezó a trabajar (tipo date)
        exp_years = int((date.today() - start).days / 365)
        return exp_years

    class Meta:
        model = Doctor  # ajusta al modelo real
        fields = ("start_date", "experience")
  • Cambia el campo de fecha de inicio según tu modelo.
  • Reutiliza la misma lógica de timedelta y división por 365.
  • Expón el valor en años como número.

¿Te gustaría compartir cómo nombraste tu método y campo de inicio en tu proyecto? Comenta tu enfoque y dudas para mejorar entre todos.

      Serializer_method_field para cálculos en Django REST