2017-04-21 4 views
0

私はSQLAlchemyののdocumenationによると、私はセットアップモデルの列のバリデータを使用したことを知ってSQLAlchemyの検証および追加のパラメータ

それは追加の引数を受け入れるように 終了を始める私は、リスナーにこのバリデータを設定する必要がありますどのように
def check_range(target, value, oldvalue, initiator, begin, end) 
    if value in range(begin, end): 
     return value 
    else: 
     raise ValidationError() 

答えて

1

OK、validator-function-namesのdictとオプションの引数をkwargsとして含むColumn定義(すでに余分な引数を追加するColumnから継承したRsColumnクラスをすでに定義していました)にパラメータを追加して解決しました。

私のアプリケーションは、カラム内の

validators=[ 
    { 
     "function": "myvalidatorname", 
     "kwargs": {"arg1": 1, "args": "someotherargument"} 
    }, 
    { ... } 
] 

-argumentの列に定義されたカスタムバリデータがある場合、それはすべてのモデルとチェックを解析し始めます。これは、関数 "execute_field_validations"を実行する "set"のリスナーを設定します。この関数は、フィールド内のすべての "バリデータ"を再度解析し、オプションで引数を指定して実行します。

def check_positive(value, field): 
    # do stuff 
    pass 


def check_range(value, field, begin, end): 
    # do range checking 
    pass 


def execute_field_validations(model_instance, value, old_value, initiator): 
    """ 
    When a "set" event is given on a models field/column then execute 
    all the fields validators optionally with arguments as described 
    in the model's definition in db.models 

    for example VehicleType.loading_meters: 

     loading_meters = RsColumn(..., validators=[ 
      {"function": "check_positive"}, 
      {"function": "check_range", "kwargs": {"begin": 0, "end": 1000}} 
     ], ...) 
    """ 
    field = model_instance.__mapper__.columns[initiator.key] 

    for validator in field.validators: 

     try: 
      assert validator["function"] in globals(), \ 
       "Invalid validator '{0}' in column ".format(
        validator["function"] 
       ) 

      validator_function = globals()[validator["function"]] 

      if "kwargs" in validator: 
       validator_function(value, field, **validator["kwargs"]) 
      else: 
       validator_function(value, field) 

     except Exception as e: 
      raise ValueError()   

def configure_validators_on_individual_fields(base): 
    """ 
    Parse through all models and all defined columns/fields 
    and see if there are individual validators set on them. 
    If so add a listser for them on the "set"-event 
    """ 
    for table in base.metadata.tables: 
     for field in base.metadata.tables[table].columns: 
      if field.validators: 
       listen(
        getattr(
         get_class_by_tablename(table), 
         field.name 
        ), 
        "set", 
        execute_field_validations 
       ) 
関連する問題