[Python] Marshmallow: schema variabile in base al valore di altri campi

Federico Fissore federico a fsfe.org
Mar 8 Dic 2020 07:34:05 CET


Ciao Riccardo

ho provato con la callable ma non è sufficiente: non prende parametri e 
farlo con una closure non mi è riuscito
Ho risolto con un Field custom, che riceve sia "value", col valore 
associato a "bevanda", sia "data", con tutti i valori associati a 
"Ordine", cioè in breve il contesto di informazioni che mi serviva.
Più o meno così:

class BevandaField(Field):

     def _deserialize(self, value, attr, data, **kwargs):
         if data['eta'] > 18:
             return BevandaMaggiorenni().load(value)

         return BevandaMinorenni().load(value)


class Ordine(Schema):
     eta = fields.Integer(required=True)
     bevanda = BevandaField(required=True)


class BevandaMaggiorenni(Schema):
     quantita = fields.Integer(required=True)


class BevandaMinorenni(Schema):
     quantita = fields.Integer(required=True)

     @validates('quantita')
     def validates_quantita(self, quantita):
         if quantita > 1:
             raise ValidationError('troppe bottiglie')

Per brevità, ho omesso qualche controllo e ottimizzazione aggiuntivi, ma 
a chi servisse dovrebbe bastare per cominciare

ciao

federico


Maggiori informazioni sulla lista Python