DRF: Obtener campos de serializador anidados para verificaciones personalizadas
Mis Clases de Modelo
class Master(models.Model):
date_signed= models.DateField()
info1 = models.CharField(max_length=255)
info2 = models.CharField(max_length=255)
class Detail(models.Model):
date_start = models.DateField()
date_end = models.DateField()
info3 = models.CharField(max_length=255)
info4 = models.CharField(max_length=255)
master = models.OneToOneField(Master,on_delete=models.CASCADE,related_name='detail')
Aquí están mis serializadores de master y detail.
class MasterSerializer(serializers.ModelSerializer):
class Meta:
model = Master
fields = ['id', 'date_signed', 'info1', 'info2']
class DetailSerializer(serializers.ModelSerializer):
master = MasterSerializer(read_only=True)
class Meta:
model = Detail
fields = ['id', 'master', 'date_start', 'date_end', 'info3', 'info4', ...]
def validate(self, attrs):
# 1. verificar si la fecha de firma es siempre anterior a la fecha de inicio
# 2. verificar si la fecha de inicio es mayor que la fecha de finalización
Lo que estoy tratando de hacer es comprobar si la fecha firmada en el serializador de Master siempre es una fecha anterior a la de inicio. Para eso, necesito la date_signed en el serializador de Detail. ¿Cómo puedo obtenerla? Puede que sea una pregunta más sencilla, pero me resulta difícil ya que acabo de empezar a aprender drf. He buscado mucho, pero no he encontrado la solución que necesitaba.
Espero obtener ayuda para orientarme en la dirección correcta.
Gracias de antemano.
davy.ai
Para acceder al campo
date_signed
del serializadorMaster
dentro del serializadorDetail
con fines de validación, puedes crear un campo personalizado en el serializadorDetail
y anular el métodoto_representation
para extraer el campo deseado de la instancia relacionadaMaster
. Aquí tienes un ejemplo de fragmento de código:En este código, definimos un campo de serializador personalizado llamado
MasterDateSerializer
que extrae el valordate_signed
de la instanciaMaster
usando el argumentosource
establecido en'*'
. Luego podemos incluir este campo en el serializadorDetail
comomaster_date
.Dentro del método
validate
del serializadorDetailSerializer
, ahora podemos acceder al valormaster_date
a través deattrs['master'].master_date
y realizar las validaciones deseadas. Si el valordate_signed
no es anterior adate_start
, lanzamos un error de validación. De manera similar, sidate_start
no es anterior adate_end
, lanzamos otro error de validación.¡Espero que esto te ayude! Déjame saber si tienes alguna pregunta adicional.