Gibt es eine Möglichkeit, die Überprüfung eines Objekts nach (oder als) dem Festlegen der Eigenschaften, aber vor dem Festschreiben der Sitzung durchzuführen?Gibt es eine Möglichkeit, Validierung für SQLAlchemy-Objekte transparent durchzuführen?
Zum Beispiel habe ich ein Domänenmodell Device
, das eine mac
Eigenschaft hat. Ich möchte sicherstellen, dass die mac
Eigenschaft einen gültigen und bereinigten Mac-Wert enthält, bevor es in der Datenbank hinzugefügt oder aktualisiert wird.
Es sieht so aus, als ob der Pythonic-Ansatz die meisten Dinge als Eigenschaften (einschließlich SQLAlchemy) zu tun hat. Wenn ich dies in PHP oder Java programmiert hätte, hätte ich wahrscheinlich Getter/Setter-Methoden zum Schutz der Daten erstellt und mir die Flexibilität gegeben, dies im Domänenmodell selbst zu handhaben.
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);
}
Was ist ein Pythonic Weg, um diese Art von Situation mit SQLAlchemy zu behandeln?
(Während ich weiß, dass die Validierung und anderswo (dh Web-Framework) behandelt werden sollte, würde ich gerne herausfinden, wie einige dieser domänenspezifischen Validierungsregeln zu behandeln, da sie häufig auftreten werden.)
UPDATE
ich weiß, dass ich property tun dies unter normalen Umständen nutzen konnte. Der Schlüssel ist, dass ich SQLAlchemy mit diesen Klassen verwende. Ich verstehe nicht genau, wie SQLAlchemy seine Magie ausübt, aber ich vermute, dass das Erstellen und Überschreiben dieser Eigenschaften allein zu instabilen und/oder unvorhersehbaren Ergebnissen führen kann.
Ich bin nicht sicher, welche Art von Magie SQLAlchemy auf die Modellklasse Eigenschaften zu binden, verwendet. Ich würde nicht annehmen, dass es sicher ist, meine eigene 'mac = property()' in meiner Klasse zu definieren. Ich denke meine Frage ist, ist das sicher zu tun? Wenn ja, gibt es irgendwelche Probleme? Wenn nicht, was sind andere Alternativen? –
Es gibt keine Magie. Das sind keine Probleme. Die Alternative ist, was wir generell tun: Wir machen Validierung * außerhalb * der Modellklasse, was es noch einfacher macht. Definieren Sie Ihre Validierung * außerhalb des Modells und Sie müssen sich dann keine Gedanken darüber machen. –