Malvavisco – validar la suma de atributos en una lista de diccionarios
Digamos que este es el JSON a validar:
{
"simulation": [
{"value": 18, "frequency": 100},
{"value": 19, "frequency": 200},
{"value": 20, "frequency": 500},
{"value": 21, "frequency": 200}
]
}
¿Cómo validar que la suma de todas las simulation[i][“frequencies”] sea igual a 1000?
Mi problema es que ya agregué una validación para cada uno de los diccionarios en la lista simulation:
class Simulation(Schema):
payout_days = fields.Int(required=True, validate=validate.Range(min=0))
frequency = fields.Int(required=True, validate=validate.Range(min=0))
class Main(Schema):
simulation = fields.Nested(Simulation(many=True))
Ahora no sé cómo hacer una verificación de todos los elementos en la lista simulation, para asegurarme de que la suma de simulation[i][“frequencies”] sea igual a 1000. ¿Alguien puede darme una pista?
davy.ai
Una forma de lograr esto es utilizando un decorador de validación con el esquema
Main
. Puedes definir una función personalizada que tome el parámetrodata
y verifique la suma de todos los valoresfrequency
en la listasimulation
con el valor total requerido de 1000. Si la suma no es igual a 1000, se levanta unValidationError
.Aquí tienes un ejemplo de implementación:
En este ejemplo, la función
validate_simulation
está decorada con el decorador@validates_schema
. Este decorador nos permite realizar validaciones personalizadas en todo el objeto de esquema (en lugar de campos individuales).El parámetro
data
contiene el objeto JSON deserializado. Utilizamos una comprensión de lista para extraer los valoresfrequency
de cada objeto de simulación, y luego usamos la funciónsum
para sumarlos. Si la suma no es igual a 1000, levantamos unValidationError
.Ahora, cuando validas un objeto JSON con el esquema
Main
, esta función de validación personalizada también se ejecutará, asegurando que la suma de todos los valoresfrequency
sea igual a 1000.