Django Charfield null =未提出错误完整性错误

时间:2016-08-27 01:26:48

标签: python django django-models

我有一个模特:

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()

2 个答案:

答案 0 :(得分:6)

没有默认的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,因为空字符串值将始终存储为空字符串,而不是NULL。如果基于字符串的字段具有null = True,则表示它具有“无数据”的两个可能值:NULL和空字符串。在大多数情况下,为“无数据”提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL。

And on validators.

答案 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')

请参阅:How can you create a non-empty CharField in Django?