2015-09-14 3 views
19

Ich habe in sqlalchemy.orm von Kolben mit dem @validates Dekorateur unter Verwendung von Feldern zu validieren, und alle haben auch schon lange nicht mehr als alle Felder voneinander unabhängig sind, wie:Flask validiert Dekorateur mehr Felder gleichzeitig

@validates('field_one') 
def validates_field_one(self, key, value): 
    #field one validation 

@validates('field_two') 
def validates_field_two(self, key, value): 
    #field two validation 

Jetzt muss ich jedoch eine Validierung durchführen, die gleichzeitig Zugriff auf field_one und field_two erfordert. Es sieht aus wie validates mehrere Argumente an der validates Dekorateur akzeptiert, wird es jedoch einfach die Validierungsfunktion einmal für jedes Argument ausführen, wie zum Beispiel:

@validates('field_one', 'field_two') 
def validates_fields(self, keys, values): 
    #field validation 

Ergebnisse in einem Arbeitsablauf von Validate field_one und dann field_two validieren. Allerdings möchte ich beide gleichzeitig validieren (ein triviales Beispiel würde behaupten, dass der Wert von field_one nicht der Wert von field_two ist, ein Beispiel dafür wären Selbst-Schleifen in einem Graphen, wo field_one und field_two verweist auf Knoten und führt eine Validierung an einer Kante durch). Wie wäre der beste Weg dahin?

Antwort

9

Ordnen Sie die Felder in der Reihenfolge an, in der sie im Modell definiert wurden. Überprüfen Sie dann, ob das letzte Feld das validierte Feld ist. Ansonsten gib den Wert einfach zurück. Wenn der Validierer eines der früheren Felder überprüft, werden einige von ihnen noch nicht festgelegt.

@validates('field_one', 'field_two') 
def validates_fields(self, key, value): 
    if key == 'field_two': 
     assert self.field_one != value 
    return value 

Siehe this example.