如何在Django中创建非空的CharField?

如何在Django中创建非空的CharField?,django,django-models,Django,Django Models,我有一个简单的模型,如下所示: class Group(models.Model): name = models.CharField(max_length = 100, blank=False) 我希望这会引发完整性错误,但它不会: group = Group() # name is an empty string here group.save() 如何确保name变量设置为非空?也就是说,要使数据库拒绝任何保存空字符串的尝试?Django的验证系统假定所有字段都是必需的,除非您提

我有一个简单的模型,如下所示:

class Group(models.Model):
    name = models.CharField(max_length = 100, blank=False)
我希望这会引发完整性错误,但它不会:

group = Group() # name is an empty string here
group.save()

如何确保name变量设置为非空?也就是说,要使数据库拒绝任何保存空字符串的尝试?

Django的验证系统假定所有字段都是必需的,除非您提到可以将其保留为空

你在Admin注册过这个类吗?当您将其留空时是否显示错误

在本例中,您的
名称将存储为空字符串,因为默认情况下
null
字段选项为False。如果要定义自定义默认值,请使用
default
字段选项

name = models.CharField(max_length=100, blank=False, default='somevalue')
在此页面上,您可以看到
空白
与数据库无关

更新:

您应该覆盖模型的clean函数,以进行自定义验证,因此您的模型def将:

class Group(models.Model):
  name = models.CharField(max_length=100, blank=False)
  def clean(self):
    from django.core.exceptions import ValidationError
    if self.name == '':
        raise ValidationError('Empty error message')
或者您可以将
ValidationError
替换为其他内容。然后在调用
group.save()
call
group.full\u clean()
之前,将调用
clean()


其他与验证相关的东西有。

或者您可以简单地使用
MinLengthValidator
,最小值为1个字符:

from django.core.validators import MinLengthValidator

class Company(BaseModel):
    """Company"""

    name = models.CharField(max_length=255,
                            validators=[MinLengthValidator(1)])

另一个不需要手动调用
clean
的选项是:

name = models.CharField(max_length=100, blank=False, default=None)
  • blank
    将阻止在模型中提供空字符串
  • default=None
    在使用类似
    group=group()
    的内容时,会将name设置为None,从而在调用
    save
    时引发异常

我花了很长时间寻找这个简单(和旧)问题的最佳解决方案,从Django 2.2开始,实际上有一个非常简单的答案,因此我将在这里写下,以防有人仍然遇到相同的问题:

由于Django 2.2,我们可以定义,因此很容易定义非空字符串约束:

来自django.db导入模型的

类文章(models.Model):
title=models.CharField(最大长度=32)
类元:
约束=[
models.CheckConstraint(check=~models.Q(title=“”),name=“non\u empty\u title”)
]

我明白你的意思。我真正想要的是拒绝任何非空字符串。我明白了,所以您想要验证模型。比我认为你应该使用团体。在
group.save()之前
。但我从未使用过它。:)避免需要确保调用
full\u clean()
的一种方法是使用
Charfield(默认值=None)
。这将引发
IntegrityError
而不是
ValidationError
@DanH-DanH的评论应该是这个问题的真实答案。谢谢。我没有使用管理界面,但它看起来blank=True只在那里有效。我希望系统能够拒绝来自任何地方的空白字段..感谢您优雅的解决方案,这对我帮助很大!您可以使用
验证程序=[bool]
bool(value)
对于任何错误都将返回false,因此空字符串、无等。尽管如果零数字、空列表等有效,这将不起作用。当使用instance.save()或model.create()保存模型时,这将不起作用。仅在使用ModelForm时有效。选中“空白将阻止在模型中提供空字符串”。这是错误的。它只防止在管理员或使用适当表单或序列化程序的任何地方传递空字符串。它不阻止
Model.objects.create(name=”“)
Model.name=“”;model.save()