Gibt es eine Möglichkeit, transparent ausführen der überprüfung auf SQLAlchemy Objekte?
Gibt es eine Möglichkeit, um die Validierung auf ein Objekt, nach der (oder als) die Eigenschaften festgelegt werden aber vor der Sitzung begangen?
Zum Beispiel habe ich ein domain model Device
hat eine mac
Eigenschaft. Ich möchte, um sicherzustellen, dass die mac
Eigenschaft enthält eine gültige und sanitized mac-Wert, bevor es Hinzugefügt oder aktualisiert in der Datenbank.
Sieht es aus wie die Pythonic Ansatz zu tun die meisten Dinge, die als Eigenschaften (einschließlich SQLAlchemy). Wenn ich hatte, codiert diese in PHP oder Java, würde ich wahrscheinlich entschieden haben, erstellen Sie getter/setter-Methoden zum Schutz der Daten und geben mir die Flexibilität, mit der diese in das domain-Modell selbst.
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 way zu behandeln diese Art von situation mit SQLAlchemy?
(Während ich bin mir bewusst, dass die Validierung und sollte behandelt werden an anderer Stelle (D. H., web-Frameworks), würde ich gerne herausfinden, wie zu handhaben einige dieser domain-spezifische Validierung Regeln, wie Sie gebunden sind, kommen Häufig vor.)
UPDATE
Ich weiß, dass ich verwenden könnte, Eigenschaft zu tun, unter normalen Umständen. Das wichtige ist, dass ich mit SQLAlchemy mit diesen Klassen. Ich verstehe nicht genau, wie SQLAlchemy ist in der Ausführung seiner Magie, aber ich vermute, dass das erstellen und überschreiben Sie diese Eigenschaften auf meine eigenen könnte führen zu instabilen und/oder unvorhersehbaren Ergebnissen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie das hinzufügen von Daten-Validierung innerhalb Ihrer SQLAlchemy-Klassen über die
@validates()
Dekorateur.Aus dem docs - Einfache Prüfungen:
nullable=false
zu der Spalte Erklärung und dann versuchen zu fangen diesession.commit()
Fehler? Oder sollte ich versuchen, eine ähnliche Prüfung? Danke.Ja. Diese kann getan werden, schön mit einem MapperExtension.
Möchten Sie vielleicht zu prüfen, before_update Referenz, weil nicht jede Instanz hier wird tatsächlich aktualisiert, um die db.
"Es sieht aus wie die Pythonic Ansatz zu tun die meisten Dinge, die als Eigenschaften"
Ist es unterschiedlich, aber das ist in der Nähe.
"Wenn ich hatte, codiert diese in PHP oder Java, würde ich wahrscheinlich entschieden haben, erstellen Sie getter/setter-Methoden..."
Gut. Das ist Pythonic genug. Ihre getter-und setter-Funktionen gebunden sind, in einer Eigenschaft; das ist ziemlich gut.
Was ist die Frage?
Fragen Sie, wie man Zauber Eigenschaft?
Jedoch, "transparente überprüfung" -- wenn ich lese, dein Beispiel-code richtig -- vielleicht nicht wirklich alle, dass eine gute Idee.
Ihr Modell und Ihre Validierung sollte wohl getrennt werden. Es ist üblich, mehrere Validierungen für ein einziges Modell. Für einige Benutzer, Felder sind optional, Feste oder nicht verwendet werden; dies führt zu mehreren Validierungen.
Werden Sie glücklicher sein nach der Django-design-Muster mit einem Form für die Validierung, getrennte form des Modells.
mac = property()
auf meine Klasse. Ich denke, meine Frage ist, ist dies sicher zu tun? Wenn ja, gibt es irgendwelche Fallstricke? Wenn nicht, was sind einige andere alternativen?inspect
Modul) dynamisch beziehen sich auf die Validierung von schema-Metadaten selbst).