如何优雅地在Django 1.5中使用full_clean()进行数据验证?

19 投票
1 回答
22510 浏览
提问于 2025-04-17 23:29

我觉得Django的模型验证对那些不使用内置ModelForm的模型来说有点不方便,虽然我也不知道具体原因。

首先,full_clean()这个方法需要手动调用。

注意,当你调用模型的save()方法时,full_clean()不会自动被调用,也不会因为ModelForm的验证而被调用。在ModelForm验证的情况下,模型的clean_fields()clean()validate_unique()这些方法会分别被调用。如果你想对自己手动创建的模型进行一步到位的验证,你需要手动调用full_clean()

其次,validators是在内置的ModelForm中使用的。

注意,当你保存一个模型时,验证器不会自动运行,但如果你使用ModelForm,它会对你表单中包含的任何字段运行验证器。

在将数据保存到数据库之前,进行数据验证是非常重要的。而且我显然更希望在模型中进行验证,而不是在视图中。那么,有没有什么好的方法可以在Django 1.5中优雅地实现这一点呢?

1 个回答

33

虽然在模型层面上进行验证听起来是个好主意,但Django默认并不这样做,原因有很多。除了兼容旧版本的问题,开发者可能不想支持这个功能,因为他们担心这会让人产生一种错误的安全感,实际上你的数据并不总是能得到验证。有些ORM方法(比如 bulk_createupdate)不会调用 save(),因此无法验证你的模型。

换句话说,保证验证的准确性是很难的,所以他们决定不假装这一点。

如果你需要对多个模型进行验证,可以创建一个简单的混入类,重写 save() 方法,并在调用 super 之前先调用 full_clean()。需要注意的是,这样可能会导致在某些情况下验证被执行两次,比如使用ModelForm时。不过,如果你的验证过程没有副作用且运行成本低,这可能不是个大问题。

想了解更多信息,可以查看以下链接:

撰写回答