如何优雅地在Django 1.5中使用full_clean()进行数据验证?
我觉得Django的模型验证对那些不使用内置ModelForm的模型来说有点不方便,虽然我也不知道具体原因。
首先,full_clean()
这个方法需要手动调用。
注意,当你调用模型的save()方法时,
full_clean()
不会自动被调用,也不会因为ModelForm的验证而被调用。在ModelForm验证的情况下,模型的clean_fields()
、clean()
和validate_unique()
这些方法会分别被调用。如果你想对自己手动创建的模型进行一步到位的验证,你需要手动调用full_clean()
。
其次,validators
是在内置的ModelForm
中使用的。
注意,当你保存一个模型时,验证器不会自动运行,但如果你使用ModelForm,它会对你表单中包含的任何字段运行验证器。
在将数据保存到数据库之前,进行数据验证是非常重要的。而且我显然更希望在模型中进行验证,而不是在视图中。那么,有没有什么好的方法可以在Django 1.5中优雅地实现这一点呢?
1 个回答
虽然在模型层面上进行验证听起来是个好主意,但Django默认并不这样做,原因有很多。除了兼容旧版本的问题,开发者可能不想支持这个功能,因为他们担心这会让人产生一种错误的安全感,实际上你的数据并不总是能得到验证。有些ORM方法(比如 bulk_create
或 update
)不会调用 save()
,因此无法验证你的模型。
换句话说,保证验证的准确性是很难的,所以他们决定不假装这一点。
如果你需要对多个模型进行验证,可以创建一个简单的混入类,重写 save()
方法,并在调用 super
之前先调用 full_clean()
。需要注意的是,这样可能会导致在某些情况下验证被执行两次,比如使用ModelForm时。不过,如果你的验证过程没有副作用且运行成本低,这可能不是个大问题。
想了解更多信息,可以查看以下链接: