2017-10-27 9 views
0

私はクラスがあるとします: フィールドはspecial_pinですが、nullにすることはできますが、特定のコンテキストではnullにすることはできません。検証関数(validates_pin)を書いて、そのフィールドを検証したいと思います。ただし、special_pinフィールドがnullの場合、検証機能は実行されません。nullフィールドでsqlalchemy.orm.validatesを使用するには?

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' 
+0

はあなたが決して 'special_pin'属性に割り当てるいないことを意味しています:あなたのユースケースは、テーブルレベルcheck constraintのために良いフィットのように見えるでしょうか? [mcve]を含めます。 DBがそれらをサポートしている場合、あなたのケースはチェック制約に適しているようです。 –

+0

はい、それは私が意味するものです。私はpostgreSQLを使用していますが、どのように制約を作成するべきですか? – tt123456

答えて

0

validates()バリデータは、「属性の名前と同様に割り当てられる値を受け取り、またはコレクションの場合は、値がコレクションに追加されるように、以下の私のコードを参照してください。 "したがって、フィールドに触れていない場合、検証は行われません。 「フィールドがnullである」と

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"), 
    ) 
関連する問題