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
)
出典
2017-04-21 20:57:55
RvL