15
votes

I think Django's model validation is a little inconvenient for those models that don't use built-in ModelForm, though not knowing why.

Firstly, full_clean() needs called manually.

Note that full_clean() will not be called automatically when you call your model’s save() method, nor as a result of ModelForm validation.In the case of ModelForm validation, Model.clean_fields(), Model.clean(), and Model.validate_unique() are all called individually.You’ll need to call full_clean manually when you want to run one-step model validation for your own manually created models.

Secondly, validators are used in built-in ModelForm.

Note that validators will not be run automatically when you save a model, but if you are using a ModelForm, it will run your validators on any fields that are included in your form.

There are great demands when you need to do data validation before saving data into databases. And obviously I'd prefer to make it in model, rather than views. So, are there any good ideas to implement this gracefully in Django 1.5?

1
What's complicated about calling full_clean() before saving your model? - Daniel Roseman

1 Answers

28
votes

Even though the idea of enforcing validation on Model level seems right, Django does not do this by default for various reasons. Except for some backward-compatibility problems, the authors probably don't want to support this because they fear this could create a false feeling of safety when in fact your data are not guaranteed to be always validated. Some ORM methods (e.g. bulk_create or update) don't call save() and thus are unable to validate your models. In other words, it is hard to guarantee the validation, thus they've decided not to pretend it.

If you need this for multiple models, you can create a simple mixin that overrides the save() method and calls full_clean() before super. Do note that this might cause the validation to be run twice in some cases, like when using ModelForm. It might not be that of an issue though if your validation routines are side-effect free and cheap to run.

For more info, please see these answers: