I am in the process of writing some validation code based on these assumptions:
One size does not fit all! Make it simple!
Provide validators with common methods/interface to output data, categorize warnings, filter/process warnings raised more than once. Do not create any sophisticated way of validation itself, at least not before writing a few real life validators.
Move out of the way and let the validators do what they are supposed to do:
for validator in all_validators:
validator.validate(model)