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

ray*_*080 12 python django validation model

我认为Django的模型验证对于那些不使用内置ModelForm的模型来说有点不方便,虽然不知道为什么.

首先,full_clean()需要手动调用.

请注意,调用模型的save()方法时,也不会自动调用full_clean(),也不会因模型化验证而调用.在ModelForm验证的情况下,Model.clean_fields(),Model.clean()和Model. validate_unique()都是单独调用的.如果要为自己手动创建的模型运行一步模型验证,则需要手动调用full_clean.

其次,validators用于内置ModelForm.

请注意,保存模型时不会自动运行验证程序,但如果您使用的是ModelForm,它将在表单中包含的任何字段上运行验证程序.

在将数据保存到数据库之前需要进行数据验证时,有很多要求.显然我更喜欢用模型而不是视图来制作它.那么,有没有好的想法来优雅地实现这个full_clean()

欢迎任何想法,谢谢!

Joz*_*zef 18

即使在模型级别上强制执行验证的想法似乎是正确的,但Django默认情况下不会出于各种原因这样做.除了一些向后兼容性问题,作者可能不希望支持这一点,因为他们担心这可能会产生错误的安全感,而实际上您的数据并不能保证始终被验证.某些ORM方法(例如bulk_createupdate)不会调用save(),因此无法验证您的模型.换句话说,很难保证验证,因此他们决定不假装.

如果您需要多个模型,可以创建一个简单的mixin来覆盖save()方法和调用full_clean()之前super.请注意,这可能会导致验证在某些情况下运行两次,例如使用ModelForm时.如果你的验证程序没有副作用且运行成本低,那么它可能不是一个问题.

有关详细信息,请参阅以下答案:

  • 我想说相反 - 它实际上是鼓励的,只是默认情况下不支持(由于历史原因)。不过,在项目中将其设为默认值很容易 - 只需创建一个 mixin 或一个新的 Model 基类,覆盖“save”方法并在内部调用“full_clean”即可。 (2认同)
  • 我已经完成了.save/full_clean()路由.问题是django queryset提供了多个完全绕过模型验证的默认函数(.update on queryset和其他一些)所以你必须强制执行一个非常严格的规则,关于如何调用模型验证函数,何时以及何时哪个数据库更新了根本不使用的方法.因此,您可以花费大量时间编写所有模型验证代码,对其进行彻底测试,但您仍然可以轻松地避免不一致. (2认同)