2013-08-31 20 views
6

SQLAlchemy belgeleri, bir modele doğrulama eklemek için bir @validates dekoratörünün nasıl kullanılacağını açıklar.İki alan için sqlalchemy validator

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 

ben iki tarih sahip bir model var ve ben bir tarih hep saniyeden daha büyüktür sağlayan bir doğrulayıcı oluşturmak istiyorum. Model düzeyinde bir doğrulayıcı oluşturmak mümkün mü? Eğer öyleyse sözdizimi nedir?

+0

Neden sadece bir tane doğrulamak ve diğer gereksinimleri karşılayan emin olamaz: Bu kodu kontrol

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

Lütfen? Örneğin. 'assert self.repeat_email == address' veya benzeri? – javex

+0

Bu muhtemelen işe yarayabilir, ancak başlatma sırasında herhangi bir sorunla karşılaşmam gerekir. Alan başına birkaç doğrulayıcı tanımlamayı ve alanların geçerli bir durum oluşturup oluşturmadığını belirlemek için bir satır doğrulayıcı kullanmayı gerçekten tercih ederim. Satır validasyonunu tek bir yerde tutmak ve farklı saha doğrulayıcıları boyunca dağılmamak için daha açık ve merhametli hisseder. – danatron

cevap

8

Doğrulayıcılar için küçük bir örnek.

Modelinizin bildiriminde CheckConstraint'i kullanabilirsiniz. Ya da @validates dekoratörünü kullanabilirsiniz. Ama bu ilk argümanlarda her isim için SQLAlchemy tarafından çağrılacak. https://gist.github.com/matrixise/6417293

+0

Teşekkürler, bu sadece ihtiyacım olan şey. – danatron

+2

'begin_at' ve' stopped_at' adlı çağrının sırası rasgele. – blurrcat