2016-08-27 29 views
1

我有一个模型:Django的Charfield空=假Inegrity错误没有提出

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) 

在我的壳,当我尝试和保存折扣对象没有输入,它不会引发错误。我究竟做错了什么?

> e = Discount() 
> e.save() 
+0

如果你什么'Discount.objects.create()'呢? – elethan

回答

1

没有Django缺省行为将CHARTEXT类型保存为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.

Further reading on null:

避免使用基于字符串的领域,如CharField和TextField空,因为空字符串值总是会被​​存储为空字符串,而不是NULL。如果基于字符串的字段的值为空= True,则表示它有两个可能的值:“无数据”:NULL和空字符串。在大多数情况下,“无数据”有两个可能的值是多余的,Django约定是使用空字符串,而不是NULL。

And on validators.