I'm just curious if anyone knows if there's good reason why django's orm doesn't call 'full_clean' on a model unless it is being saved as part of a model form.
Note that full_clean() will not be called automatically when you call your model’s save() method. You’ll need to call it manually when you want to run one-step model validation for your own manually created models. django's full clean doc
(NOTE: quote updated for Django 1.6... previous django docs had a caveat about ModelForms as well.)
Are there good reasons why people wouldn't want this behavior? I'd think if you took the time to add validation to a model, you'd want that validation run every time the model is saved.
I know how to get everything to work properly, I'm just looking for an explanation.
AFAIK, this is because of backwards compatibility. There are also problems with ModelForms with excluded fields, models with default values, pre_save() signals, etc.
Sources you might be intrested in:
The simpliest way to call the
full_clean
method is just to overridesave
method in yourmodel
:If you have a model that you want to ensure has at least one FK relationship, and you don't want to use
null=False
because that requires setting a default FK (which would be garbage data), the best way I've come up with is to add custom.clean()
and.save()
methods..clean()
raises the validation error, and.save()
calls the clean. This way the integrity is enforced both from forms and from other calling code, the command line, and tests. Without this, there is (AFAICT) no way to write a test that ensures that a model has a FK relation to a specifically chosen (not default) other model.Instead of inserting a piece of code that declares a receiver, we can use an app as
INSTALLED_APPS
section insettings.py
Before that, you may need to install
django-fullclean
using PyPI:Because of the compatibility considering, the auto clean on save is not enabled in django kernel.
If we are starting a new project and want the default
save
method on Model could clean automatically, we can use the following signal to do clean before every model was saved.