Esiste un modo per eseguire la convalida su un oggetto dopo (o come) le proprietà vengono impostate ma prima che la sessione venga confermata?Esiste un modo per eseguire in modo trasparente la convalida sugli oggetti SQLAlchemy?
Per esempio, ho un modello di dominio Device
che ha una proprietà mac
. Vorrei assicurarmi che la proprietà mac
contenga un valore mac valido e disinfettato prima di essere aggiunto o aggiornato nel database.
Sembra che l'approccio Python sia quello di fare la maggior parte delle cose come proprietà (incluso SQLAlchemy). Se avessi codificato questo in PHP o Java, probabilmente avrei optato per creare metodi getter/setter per proteggere i dati e darmi la flessibilità di gestirli nel modello di dominio stesso.
public function mac() { return $this->mac; }
public function setMac($mac) {
return $this->mac = $this->sanitizeAndValidateMac($mac);
}
public function sanitizeAndValidateMac($mac) {
if (! preg_match(self::$VALID_MAC_REGEX)) {
throw new InvalidMacException($mac);
}
return strtolower($mac);
}
Che è un modo Pythonic per gestire questo tipo di situazione usando SQLAlchemy?
(Sebbene sia a conoscenza della convalida e debba essere gestito altrove (ad esempio, il framework Web) vorrei capire come gestire alcune di queste regole di convalida specifiche del dominio poiché sono destinate a venire frequentemente.)
UPDATE
so che potrei usare property per fare questo in circostanze normali. La parte fondamentale è che sto usando SQLAlchemy con queste classi. Non capisco esattamente come SQLAlchemy stia eseguendo la sua magia, ma sospetto che la creazione e l'override di queste proprietà sul mio potrebbero portare a risultati instabili e/o imprevedibili.
non sono sicuro che tipo di magia SQLAlchemy utilizza per legarsi alle proprietà della classe del modello. Non darei per scontato che sia sicuro definire la mia 'mac = property()' sulla mia classe. Penso che la mia domanda sia questa sicurezza da fare? Se è così, ci sono dei trucchi? In caso contrario, quali sono alcune altre alternative? –
Non c'è magia. Non sono trucchi. L'alternativa è ciò che generalmente facciamo: facciamo la validazione * al di fuori * della classe del modello, rendendola ancora più semplice. Definisci la tua convalida * al di fuori * del modello, e quindi non devi preoccuparti di nulla di tutto ciò. –