2013-08-31 12 views
6

I documenti SQLAlchemy spiegano come utilizzare un decoratore @validates per aggiungere la convalida a un modello.validatore sqlalchemy per due campi

from sqlalchemy.orm import validates 

class EmailAddress(Base): 
    __tablename__ = 'address' 

    id = Column(Integer, primary_key=True) 
    email = Column(String) 

    @validates('email') 
    def validate_email(self, key, address): 
     assert '@' in address 
     return address 

Ho un modello con due date, e mi piacerebbe creare un validatore garantire una data è sempre maggiore del secondo. È possibile creare un validatore a livello di modello? Se sì, qual è la sintassi?

+0

Perché non puoi semplicemente validare uno e fare in modo che soddisfi i requisiti di cui l'altra? Per esempio. 'asserire self.repeat_email == indirizzo' o simile? – javex

+0

Probabilmente potrebbe funzionare, tuttavia avrei bisogno di intrappolare eventuali problemi durante l'inizializzazione. Preferisco davvero definire alcuni validatori per campo e un validatore di riga per determinare se i campi creano uno stato valido. Sembra semplicemente più esplicito e controllabile mantenere la convalida delle righe in un unico posto e non disperse tra i vari validatori di campo. – danatron

risposta

8

Ecco un piccolo esempio per i validatori.

È possibile utilizzare CheckConstraint nella dichiarazione del modello. Oppure puoi usare il decoratore @validates. Ma questo sarà chiamato da SQLAlchemy per ogni nome nei primi argomenti.

@validates('started_at', 'stopped_at') 
def do_validation(self, key, field): 
    return field 

Vi preghiamo di controllare questo codice: https://gist.github.com/matrixise/6417293

+0

Grazie, è proprio quello di cui avevo bisogno. – danatron

+2

L'ordine in cui vengono chiamati 'started_at' e' stopped_at' è casuale. – blurrcat

Problemi correlati