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

blu*_*inc 4 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)
Run Code Online (Sandbox Code Playgroud)

在我的shell中,当我尝试保存没有输入的Discount对象时,它不会引发错误.我究竟做错了什么?

> e = Discount()
> e.save()
Run Code Online (Sandbox Code Playgroud)

sou*_*eux 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})
Run Code Online (Sandbox Code Playgroud)

然后将验证器添加到您的模型:

code = models.CharField(max_length=14, unique=True, validators=[validate_not_empty])
Run Code Online (Sandbox Code Playgroud)

这将处理您想要的表单验证,但验证程序在保存模型实例时不会自动运行.进一步阅读这里.如果要在每次保存实例时验证这一点,我建议覆盖默认save行为,检查字符串的值,并在必要时通过引发错误来中断保存.save这里重写的好帖子.

进一步阅读null:

避免在基于字符串的字段(如CharField和TextField)上使用null,因为空字符串值将始终存储为空字符串,而不是NULL.如果基于字符串的字段具有null = True,则表示它具有"无数据"的两个可能值:NULL和空字符串.在大多数情况下,为"无数据"提供两个可能的值是多余的; Django约定是使用空字符串,而不是NULL.

在验证器上.