它们是两个独立的实现,分别存在于 Django 的 Model 和 Form 对象中,用于验证不同的数据类型和场景。
1. 两种 full_clean() 方法的区别
1.1 Model.full_clean()
• 定义位置:django.db.models.Model
• 调用时机:必须手动调用,Django 默认不会在保存(save())时自动调用它。
• 作用:
• 验证模型字段的约束条件(如 max_length、unique 等)。
• 调用 clean_<field>() 方法,执行字段级自定义验证。
• 调用模型的 clean() 方法,执行模型级的全局验证。
• 典型场景:
• 在调用 save() 前确保模型实例的数据有效。
1.2 Form.full_clean()
• 定义位置:django.forms.BaseForm
• 调用时机:在调用 Form.is_valid() 时会自动调用。
• 作用:
• 验证表单字段的数据约束(如必填字段、字段类型)。
• 调用 clean_<field>() 方法,执行字段级的自定义验证。
• 调用表单的 clean() 方法,执行全局验证逻辑。
• 清理数据并将合法数据存储在 cleaned_data 中。
• 典型场景:
• 用于表单数据的验证和清理。
主要区别
• Model.full_clean():用于模型实例验证,必须手动调用,主要在保存数据前确保合法性。
• Form.full_clean():用于表单数据验证,会在 is_valid() 中自动调用。
关联
• 如果通过 ModelForm 提交数据,Form.full_clean() 会验证表单的字段,但不会自动调用 Model.full_clean(),需要显式调用以验证模型的完整性。