2015-09-14 7 views
19

私はフィールドを検証するためにフラスコからsqlalchemy.ormに@validatesデコレータを使用している、とすべてがうまく限り、すべてのフィールドのような、互いに独立しているとして行ってきました:フラスコを同時にデコレータ複数のフィールドを検証し

@validates('field_one') 
def validates_field_one(self, key, value): 
    #field one validation 

@validates('field_two') 
def validates_field_two(self, key, value): 
    #field two validation 

しかし、今ではfield_oneとfield_twoに同時にアクセスする必要のある検証を行う必要があります。検証field_oneの作業の流れで

@validates('field_one', 'field_two') 
def validates_fields(self, keys, values): 
    #field validation 

結果、その後field_twoを検証:検証しが検証しデコレータに複数の引数を受け入れるように見えます、しかし、それは単になど、各引数に対して一度検証機能を実行します。しかし、私は両方を同時に検証したいと思います(field_oneの値がfield_twoの値ではないという些細な例があります。その例は、グラフのself-loopsを許可しない例です)。field_oneとfield_twoノードを参照し、エッジで検証を実行しています)。それをする最善の方法はどのようになりますか?

答えて

9

フィールドをモデルで定義された順序で並べ替えます。次に、最後のフィールドが検証されているフィールドであるかどうかを確認します。それ以外の場合は、値をチェックしないで戻します。バリデータが以前のフィールドの1つを検証している場合、その一部はまだ設定されません。

@validates('field_one', 'field_two') 
def validates_fields(self, key, value): 
    if key == 'field_two': 
     assert self.field_one != value 
    return value 

this exampleを参照してください。