这是验证Django模型字段的方法吗? [英] Is this the way to validate Django model fields?
问题描述
$ b
class Reviewer(models.Model):
name = models.CharField(max_length = 128,default = None)
def clean(self,* args,** kwargs):
if self.name =='':
raise ValidationError('Reviewer name not not be blank')
super(审查者,自我).clean(* args,** kwargs)
def full_clean(self,* args,** kwargs):
return self.clean(* args,** kwargs )
def save(self,* args,** kwargs):
self.full_clean()
super(Reviewer,self).save(* args,** kwargs )
首先,不要覆盖 full_clean
正如你所做的那样。从 django docs on full_clean :
Model.full_clean(exclude = None)
此方法调用Model.clean_fields() / code>,
Model.clean()
和Model.validate_unique()
,按顺序提出一个ValidationError
,它有一个message_dict
属性,包含所有三个阶段的错误。
所以 full_clean
方法已经调用 clean
,但是阻止它调用其他两种方法。
其次,在$中调用 full_clean
c $ c> save 方法是折中的。请注意,当验证模型表单时,已经调用 full_clean
在Django管理员。因此,如果您在 save
方法中调用 full_clean
,则该方法将运行两次。
保存方法通常不会提出验证错误,有人可能会调用 save
而不是捕获导致错误。但是,我喜欢你调用 full_clean
而不是在save方法本身进行检查 - 这种方法允许模型表单首先捕获问题。
最后,您的 clean
方法可以正常工作,但实际上您可以在模型字段本身处理示例。将 CharField
定义为
name = models.CharField(max_length = 128 )
blank
选项将默认为False。如果该字段为空,则在运行 full_clean
时,会引发 ValidationError
。在 CharField
中放入 default = None
不会造成任何伤害,但是当您不要t实际上允许无
作为值。
As I understand it, when one creates a Django application, data is validated by the form before it's inserted into a model instance which is then written to the database. But if I want to create an additional layer of protection at the data model layer, is what I've done below the current "best practice?" I'm trying to ensure that a reviewer's name cannot be omitted nor be left blank. Should I be putting any custom validation in the 'clean' method as I've done here and then have 'save' call 'full_clean" which calls 'clean'? If not, what's the preferred method? Thanks.
class Reviewer(models.Model):
name = models.CharField(max_length=128, default=None)
def clean(self, *args, **kwargs):
if self.name == '':
raise ValidationError('Reviewer name cannot be blank')
super(Reviewer, self).clean(*args, **kwargs)
def full_clean(self, *args, **kwargs):
return self.clean(*args, **kwargs)
def save(self, *args, **kwargs):
self.full_clean()
super(Reviewer, self).save(*args, **kwargs)
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 callsModel.clean_fields()
,Model.clean()
, andModel.validate_unique()
, in that order and raises aValidationError
that has amessage_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.
这篇关于这是验证Django模型字段的方法吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!