2013-08-31 59 views
6

SQLAlchemy文档说明如何使用@validates装饰器向模型添加验证。两个字段的sqlalchemy验证程序

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 

我有一个有两个日期的模型,我想创建一个验证器,以确保一个日期总是大于第二个日期。是否可以创建模型级别验证器?如果是的话,语法是什么?

+0

为什么你就不能验证一个,并确保它符合其他要求?例如。 '断言self.repeat_email ==地址'或类似的? – javex

+0

这可能可行,但我需要在初始化期间捕获任何问题。我真的更愿意为每个字段定义一些验证器,并使用行验证器来确定这些字段是否创建了有效状态。它只是感觉更加明确和可行,在一个地方进行行验证,而不是散布在不同的现场验证器中。 – danatron

回答

8

这是验证器的一个小例子。

您可以在模型声明中使用CheckConstraint。或者你可以使用@validates装饰器。但是这个将由第一个参数中的每个名称通过SQLAlchemy调用。

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

请检查该代码:https://gist.github.com/matrixise/6417293

+0

谢谢,那正是我所需要的。 – danatron

+2

调用'started_at'和'stopped_at'的顺序是随机的。 – blurrcat