Firstly, you shouldn't override full_clean
as you have done. From the django docs on full_clean:
Model.full_clean(exclude=None)
This method calls Model.clean_fields()
, Model.clean()
, and Model.validate_unique()
, in that order and raises a ValidationError
that has a message_dict
attribute containing errors from all three stages.
So the full_clean
method already calls clean
, but by overriding it, you've prevented it calling the other two methods.
Secondly, calling full_clean
in the save
method is a trade off. Note that full_clean
is already called when model forms are validated, e.g. in the Django admin. So if you call full_clean
in the save
method, then the method will run twice.
It's not usually expected for the save method to raise a validation error, somebody might call save
and not catch the resulting error. However, I like that you call full_clean
rather than doing the check in the save method itself - this approach allows model forms to catch the problem first.
Finally, your clean
method would work, but you can actually handle your example case in the model field itself. Define your CharField
as
name = models.CharField(max_length=128)
The blank
option will default to False. If the field is blank, a ValidationError
will be raised when you run full_clean
. Putting default=None
in your CharField
doesn't do any harm, but it is a bit confusing when you don't actually allow None
as a value.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…