2015-09-14 20 views
19

ho utilizzato il decoratore @validates in sqlalchemy.orm dalla boccetta per convalidare campi, e tutto è andato bene finché tutti i campi sono indipendenti l'uno dall'altro come:Flask convalida decoratore più campi contemporaneamente

@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 

Tuttavia, ora ho bisogno di fare qualche convalida che richiederà l'accesso a field_one e field_two simultaneamente. Sembra Convalida accetta più argomenti al Convalida decoratore, tuttavia, sarà sufficiente eseguire la funzione di convalida una volta per ogni argomento, come ad esempio:

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

risultati in un flusso di lavoro di convalidare field_one e quindi convalidare field_two. Tuttavia, mi piacerebbe convalidare entrambi allo stesso tempo (un esempio banale del quale sarebbe asserire che il valore di field_one non è il valore di field_two, un esempio del quale non autorizza il self-loops in un grafico dove field_one e field_two fare riferimento ai nodi e sta eseguendo la validazione su un bordo). Come sarebbe il modo migliore per farlo?

risposta

9

Ordinare i campi nell'ordine in cui sono stati definiti sul modello. Quindi controlla se l'ultimo campo è quello che viene convalidato. Altrimenti, basta riportare il valore deselezionato. Se il validatore sta convalidando uno dei campi precedenti, alcuni di essi non saranno ancora impostati.

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

Vedere this example.