如何在Null字段上使用sqlalchemy.orm.validates?

时间:2017-10-27 18:03:49

标签: python sqlalchemy

假设我有一个班级: 我有一个字段special_pin可以为null,但在特定上下文中不能为null。我想通过编写验证函数(validates_pin)来验证该字段。但是,当special_pin字段为空时,验证函数将不会运行。

请参阅下面的代码

from sqlalchemy.orm import validates

class User(db.Model):
  user_type = db.column(db.String, nullable=False)
  special_pin = db.column(db.String)

  @validates('special_pin')
  def validates_pin(self, key, field):
  if self.user_type == 'special'
    assert field, 'special user must have special pin'

1 个答案:

答案 0 :(得分:0)

validates()验证器"接收属性的名称以及要分配的值,或者在集合的情况下,接收要添加到集合的值"。因此,如果未触摸该字段,则不会进行验证。您的用例似乎非常适合表级check constraint

class User(db.Model):
    user_type = db.Column(db.String, nullable=False)
    special_pin = db.Column(db.String)

    __table_args__ = (
        # Note the trailing comma. __table_args__ should be a tuple or a dict.
        db.CheckConstraint("user_type != 'special' OR special_pin IS NOT NULL",
                           name="check_special_user_has_pin"),
    )