我有一个模特:
class Discount(models.Model):
code = models.CharField(max_length=14, unique=True, null=False, blank=False)
email = models.EmailField(unique=True)
discount = models.IntegerField(default=10)
在我的shell中,当我尝试保存没有输入的Discount对象时,它不会引发错误。我做错了什么?
> e = Discount()
> e.save()
答案 0 :(得分:6)
没有默认的Django行为会将CHAR
或TEXT
类型保存为Null
- 它将始终使用空字符串(''
)。 null=False
对这些类型的字段没有影响。
blank=False
表示在使用模型渲染ModelForm时,默认情况下将需要该字段。它不会阻止您手动保存没有该值的模型实例。
您想要的是自定义模型验证器:
from django.core.exceptions import ValidationError
def validate_not_empty(value):
if value == '':
raise ValidationError('%(value)s is empty!'), params={'value':value})
然后将验证器添加到您的模型中:
code = models.CharField(max_length=14, unique=True, validators=[validate_not_empty])
这将处理您想要的表单验证,但验证程序在保存模型实例时不会自动运行。 Further reading here.如果要在每次保存实例时验证这一点,我建议覆盖默认的save
行为,检查字符串的值,并在必要时通过引发错误来中断保存。 Good post on overriding save
here.
避免在基于字符串的字段(如CharField和TextField)上使用null,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。
答案 1 :(得分:0)
如果CharField为空,为了让你的模型引发错误,你只需要覆盖clean函数,如下所示:
from django.core.exceptions import ValidationError
class Discount(models.Model):
code = models.CharField(max_length=14, unique=True)
def clean(self):
if self.code == '':
raise ValidationError('Empty code not allowed')