es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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ámetro data y verifique la suma de todos los valores frequency en la lista simulation con el valor total requerido de 1000. Si la suma no es igual a 1000, se levanta un ValidationError.

    Aquí tienes un ejemplo de implementación:

    from marshmallow import validate, Schema, fields, validates_schema, ValidationError
    
    class Simulation(Schema):
        value = 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)
    
        @validates_schema
        def validate_simulation(self, data, **kwargs):
            if sum([sim['frequency'] for sim in data['simulation']]) != 1000:
                raise ValidationError('La suma de las frecuencias debe ser igual a 1000')
    

    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 valores frequency de cada objeto de simulación, y luego usamos la función sum para sumarlos. Si la suma no es igual a 1000, levantamos un ValidationError.

    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 valores frequency sea igual a 1000.

Comments are closed.