[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