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

时间:2011-08-04 11:21:42

标签: 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变量设置为非空?即,让数据库拒绝任何保存空字符串的尝试?

5 个答案:

答案 0 :(得分:15)

在这种情况下,Django docs会将name存储为空字符串,因为默认情况下null字段选项为False。如果要定义自定义默认值,请使用default字段选项。

name = models.CharField(max_length=100, blank=False, default='somevalue')

在此页面上,您可以看到blank与数据库无关。

<强>更新

您应该覆盖模型的清理功能,以进行自定义验证,因此您的模型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()致电group.full_clean()之前致电clean()

其他与验证相关的事情是here

答案 1 :(得分:6)

或者你可以简单地使用MinLengthValidator和1-char最小值:

from django.core.validators import MinLengthValidator

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:1)

Django的验证系统假定所有字段都是必需的,除非你提到它可以留空......

您是否在管理员中注册了课程?当你把它留空时会显示错误吗?

Django krishna

答案 4 :(得分:0)

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

从Django 2.2开始,我们可以定义(CheckConstrainsts)[https://docs.djangoproject.com/en/2.2/ref/models/constraints/#checkconstraint],因此很容易定义一个非空字符串约束:

from django.db import models

class Article(models.Model):
   title = models.CharField(max_length=32)

    class Meta:
        constraints = [
            models.CheckConstraint(check=~models.Q(title=""), name="non_empty_title")
        ]