这是验证Django模型字段的方法吗? [英] Is this the way to validate Django model fields?

查看:98
本文介绍了这是验证Django模型字段的方法吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

据我了解,当创建一个Django应用程序时,数据在插入到模型实例之前被表单验证,然后将其写入数据库。但是,如果我想在数据模型层创建一个额外的保护层,那么我在当前的最佳实践之下做了什么呢?我试图确保评论者的名字不能省略,也不能留空。我应该像我在这里做的那样把任何自定义验证放在'clean'方法中,然后把'call'调用'full_clean'调用'clean',如果没有,那么最好的方法是什么? b
$ 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 calls Model.clean_fields(), Model.clean(), and Model.validate_unique(), in that order and raises a ValidationError that has a message_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆